Wie kann ich das Änderungsdatum einer Datei ändern?

189

Gibt es eine Möglichkeit, das Datum zu ändern, an dem eine Datei geändert / erstellt wurde (was in Nautilus oder mit dem Befehl ls -l angezeigt wird)? Idealerweise suche ich nach einem Befehl, der die Datums- / Zeitstempel einer ganzen Reihe von Dateien zu einem bestimmten Zeitpunkt früher oder später ändern kann (z. B. +8 Stunden oder -4 Tage usw.).

    
snej 22.09.2011, 07:32

7 Antworten

255

Sie können die Änderungszeit einer Datei mit dem Befehl touch ändern:

touch filename

Standardmäßig wird die Änderungszeit der Datei auf die aktuelle Zeit gesetzt, es gibt jedoch eine Reihe von Flags, z. B. das Flag -d , um ein bestimmtes Datum auszuwählen. Wenn Sie beispielsweise eine Datei zwei Stunden vor dem Geschenk als geändert definieren möchten, können Sie Folgendes verwenden:

touch -d "2 hours ago" filename

Wenn Sie die Datei stattdessen relativ zur vorhandenen Änderungszeit ändern möchten, sollten Sie Folgendes tun:

touch -d "$(date -R -r filename) - 2 hours" filename

Wenn Sie eine große Anzahl von Dateien ändern möchten, können Sie Folgendes verwenden:

find DIRECTORY -print | while read filename; do
    # do whatever you want with the file
    touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done

Sie können die Argumente in find ändern, um nur die Dateien auszuwählen, an denen Sie interessiert sind. Wenn Sie nur die Dateiänderungszeiten relativ zur aktuellen Zeit aktualisieren möchten, können Sie dies vereinfachen:

find DIRECTORY -exec touch -d "2 hours ago" {} +

Dieses Formular ist nicht mit der relativen Dateiversionsversion möglich, da es die Shell verwendet, um die Argumente für touch zu bilden.

Soweit es die Erstellungszeit betrifft, verfolgen die meisten Linux-Dateisysteme diesen Wert nicht. Den Dateien ist ein ctime zugeordnet, aber es wird nachverfolgt, wenn die Dateimetadaten zuletzt geändert wurden. Wenn sich die Berechtigungen der Datei nie ändern, kann es vorkommen, dass die Erstellungszeit beibehalten wird, dies ist jedoch ein Zufall. Das explizite Ändern der Dateiänderungszeit zählt als Änderung der Metadaten. Dies hat auch den Nebeneffekt, dass ctime aktualisiert wird.

    
James Henstridge 22.09.2011 08:34
39

Danke für die Hilfe. Das hat für mich funktioniert:

Gehen Sie im Terminal in das Verzeichnis für die Datumsbearbeitung. Dann tippe:

find -print | while read filename; do
    # do whatever you want with the file
    touch -t 201203101513 "$filename"
done

Sie werden ein "& gt;" nachdem du Enter gedrückt hast, außer zum letzten Mal - & gt; "fertig".

Hinweis:  Möglicherweise möchten Sie "201203101513"

ändern

"201203101513" = ist das Datum, das für alle Dateien in diesem Verzeichnis gewünscht wird.

Siehe meine Webseite

    
EFL 10.03.2012 15:21
22

Einfachster Weg - Zugriff und Änderung sind gleich:

touch -a -m -t 201512180130.09 fileName.ext

Wo:

-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format

Wenn Sie NOW verwenden möchten, löschen Sie einfach -t und den Zeitstempel.

Um zu verifizieren, dass sie alle gleich sind: stat fileName.ext

Siehe: touch man

    
Jadeye 19.12.2015 15:58
6

Touch kann das Datum einer Datei ganz von selbst referenzieren, ohne dass date aufgerufen werden muss oder Befehlsersetzung verwendet wird. Hier ist ein bisschen von der Info-Seite von Touch:

'-r FILE' '--reference=FILE'
     Use the times of the reference FILE instead of the current time.
     If this option is combined with the '--date=TIME' ('-d TIME')
     option, the reference FILE's time is the origin for any relative
     TIMEs given, but is otherwise ignored.  For example, '-r foo -d
     '-5 seconds'' specifies a time stamp equal to five seconds before
     the corresponding time stamp for 'foo'.  If FILE is a symbolic
     link, the reference timestamp is taken from the target of the
     symlink, unless '-h' was also in effect.

Zum Beispiel um dem Datum einer Datei 8 Stunden hinzuzufügen (Dateiname von file wird nur im Falle von Leerzeichen usw. zitiert):

touch -r "file" -d '+8 hour' "file"

Verwenden Sie eine Schleife über alle Dateien im aktuellen Verzeichnis:

for i in *; do touch -r "$i" -d '+8 hour' "$i"; done

Ich habe gehört, dass die Verwendung von * und for die Dateinamen selbst auswählen ist sicherer , aber die Verwendung von find -print0 | xargs -0 touch ... sollte meisten verrückten Zeichen wie Zeilenumbrüche, Leerzeichen, Anführungszeichen, umgekehrte Schrägstriche in einem Dateinamen. (PS. Versuchen Sie nicht, verrückte Zeichen in Dateinamen an erster Stelle zu verwenden).

Um beispielsweise alle Dateien in thatdir zu finden, deren Dateinamen mit einem s beginnen, und einen Tag zum modifizierten Zeitstempel dieser Datei hinzuzufügen, verwenden Sie:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
    
Xen2050 17.12.2016 15:52
2

Dieses kleine Skript funktioniert zumindest für mich

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done
    
joakim 06.08.2013 21:40
1

Es ist schon lange her, dass ich irgendein Unix-Programm geschrieben habe, aber ich habe versehentlich das Jahr falsch auf ein paar Weihnachtsfotos gesetzt, und ich wusste, wenn ich das Datum von 2015 auf 2014 nicht ändere, wäre es ein Problem später.

Vielleicht ist das eine leichte Aufgabe, aber ich habe keinen einfachen Weg gefunden, das zu tun.

Ich habe ein Skript, das ich hier gefunden habe, geändert, das ursprünglich dazu verwendet wurde, das Datum um minus einen Monat zu ändern.

Hier ist das ursprüngliche Skript:

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Hier ist mein modifiziertes Skript, das das Datum auf das Jahr "2014" zwang:

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v +1y -r $(stat -f %m  "${f}") +2014%m%d%H%M.%S) "${f}"
done

Ich weiß jetzt, dass ich eine allgemeinere Version hätte machen können:

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch (+1y adds a year "-1y" subtracts a year)
 # Below line subtracts a year
 touch -t $(date -v -1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
 # Below line adds a year
 # touch -t $(date -v +1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Um diese Datei zu verwenden, müssten Sie sie schreiben und

chmod +x fn

zum Ausführen:

./fn files-to-change

fn = dein-Dateiname-das-ist-dein-Befehl

Beispiel

./fn *.JPG

ändert das Datum um minus ein Jahr in dem Verzeichnis, in dem Sie sich befinden.

    
RickK 05.01.2015 00:28
-6

Ändern Sie einfach Datum und Uhrzeit in den Einstellungen. dann speichern Sie Ihre Datei, es ändert sich automatisch

    
vampiremac 28.11.2012 09:37

Tags und Links