Wie kann ich das Änderungs- / Erstellungsdatum einer Datei ändern?

234

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 einen Befehl, der die Datums- / Zeitstempel einer ganzen Reihe von Dateien auf eine bestimmte Zeitspanne früher oder später (z. B. +8 Stunden oder -4 Tage usw.) ändern kann.

snej
quelle

Antworten:

324

Solange Sie der Eigentümer der Datei (oder Root) sind, können Sie die Änderungszeit einer Datei mit dem folgenden touchBefehl ändern :

touch filename

Standardmäßig wird die Änderungszeit der Datei auf die aktuelle Zeit eingestellt, es gibt jedoch eine Reihe von Flags, z. B. das -dFlag zum Auswählen eines bestimmten Datums. Um beispielsweise eine Datei so einzustellen, dass sie zwei Stunden vor der Gegenwart geändert wurde, 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 ändern find, um nur die Dateien auszuwählen, an denen Sie interessiert sind. Wenn Sie nur die Dateiänderungszeiten im Verhältnis zur aktuellen Zeit aktualisieren möchten, können Sie dies folgendermaßen vereinfachen:

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

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

Die meisten Linux-Dateisysteme verfolgen diesen Wert im Hinblick auf die Erstellungszeit nicht. Es ist eine ctimeDatei zugeordnet, die jedoch nachverfolgt, wann die Dateimetadaten zuletzt geändert wurden. Wenn die Berechtigungen der Datei nie geändert wurden, wird möglicherweise die Erstellungszeit gespeichert, dies ist jedoch ein Zufall. Das explizite Ändern der Dateiänderungszeit gilt als Metadatenänderung und hat daher auch den Nebeneffekt, dass die Datei aktualisiert wird ctime.

James Henstridge
quelle
Um den einfacheren Fall zu erwähnen, in dem sich alle Dateien im selben Ordner befinden: touch -d "2 hours ago" /path/*.txtZum Beispiel.
Enzotib
1
Ich möchte auch hinzufügen, dass das Ändern ctimein keiner Weise standardmässig möglich ist.
Ordnen Sie den
Ist das alles POSIX?
user1011471
1
Die Informationen ctimezum Zeitpunkt der Metadatenänderung stammen von POSIX. Ich weiß nicht, ob die Shell-Fragmente in meiner Antwort mit strengen POSIX-Shell-Dienstprogrammen funktionieren würden. Aber sie arbeiten definitiv mit Ubuntu, dem Kontext für Antworten auf dieser Site.
James Henstridge
1
Unter OSX möchten Sie möglicherweise gtouchüber verwenden brew install coreutils.
Nobu
46

Danke für die Hilfe. Das hat bei mir funktioniert:

Gehen Sie im Terminal in das Verzeichnis, um das Datum zu bearbeiten. Dann tippe:

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

Sie werden ein ">" sehen, nachdem Sie die Eingabetaste gedrückt haben, außer zum letzten Mal -> "erledigt".

Hinweis: Möglicherweise möchten Sie "201203101513" ändern.

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

Siehe meine Webseite

EFL
quelle
Es funktioniert nicht wie erwartet, wenn ein Dateiname Leerzeichen enthält
Angel
Webseite ist nicht mehr, obwohl es 6 Jahre später ist. Dies ist jedoch die Antwort, nach der ich gesucht habe. Verwenden Sie für diejenigen, die Sekunden in ihre Zeit aufnehmen möchten, .sswobei ss die Anzahl der Sekunden ist. (Hinweis: Dies scheint keine Subsekunden-Timings wie Nanosekunden oder Millisekunden zu steuern, die für mich nur als Nullen angezeigt wurden. Dieser Unterschied war jedoch für meinen Anwendungsfall zulässig.)
Spencer D
34

Einfachster Weg - Zugriff und Änderung erfolgen auf die gleiche Weise:

touch -a -m -t 201512180130.09 fileName.ext

Wo:

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

Wenn Sie verwenden möchten, lassen Sie NOWeinfach den -tund den Zeitstempel fallen.

So überprüfen Sie, ob alle gleich sind: stat fileName.ext

Siehe: Mensch berühren

Jadeye
quelle
1
Ich habe versucht, es mit stat zu überprüfen, aber keines der touchFlags führt zu einem korrekten Ergebnis. Das Änderungsdatum wurde angepasst, aber das Änderungs- und Zugriffsdatum wurde tatsächlich auf JETZT geändert
Xerus
Es hat bei mir nicht funktioniert, es hat nur die "Change"
-Zeit
@Revious, Xerus Was ist der Unterschied zwischen der changedZeit und den modifiedZeitstempeln?
ijoseph
9

Touch kann auf das Datum einer Datei selbst verweisen, ohne dass eine dateBefehlsersetzung aufgerufen oder verwendet werden muss. Hier ist ein bisschen von der Infoseite 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.

Um beispielsweise das Datum einer Datei um 8 Stunden zu verlängern (Dateiname in fileAnführungszeichen nur bei Leerzeichen usw.):

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

Verwenden einer Schleife über alle Dateien im aktuellen Verzeichnis:

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

Ich habe gehört , dass eine mit *und lassen Sie fordie Dateinamen wählen selbst ist sicherer , aber unter Verwendung find -print0 | xargs -0 touch ... sollte behandeln die meisten verrückten Charaktere wie Zeilenumbrüche, Leerzeichen, Anführungszeichen, Schrägstriche in einem Dateinamen. (PS. Versuchen Sie zunächst, keine verrückten Zeichen in Dateinamen zu verwenden).

Um beispielsweise alle Dateien zu finden, thatdirderen Dateinamen mit einem beginnen s, und den geänderten Zeitstempel dieser Datei um einen Tag zu verlängern, verwenden Sie:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
Xen2050
quelle
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
quelle
2
Das Anpassen des Datums von Bildern basierend auf den Metainformationen im Bild wäre ziemlich nützlich. ImageMagicks Identifikation kann verwendet werden. ZB 'identifizieren -verbose <Bild> | grep -i Datum', 'identifizieren -format% [exif: DateTime] <Bild>' zeigt möglicherweise '2015: 01: 08 10:19:10' (nicht alle Bilder haben Exif-Daten ). Dies funktioniert (mit sed kann das Datum in das Format touch konvertiert werden): 'touch -d $ (identifiziere -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
Gaoithe
1

Es ist lange her, dass ich irgendeine Art von Unix-Programm geschrieben habe, aber ich habe versehentlich das Jahr auf einer Reihe von Weihnachtsfotos falsch eingestellt, und ich wusste, dass es später ein Problem sein würde, wenn ich das Datum von 2015 auf 2014 nicht ändern würde .

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

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

Hier ist das Original-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

Mir ist jetzt klar, 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

ausführen:

./fn files-to-change

fn = Ihr-Dateiname-der-ist-Ihr-Befehl

Beispiel

./fn *.JPG

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

RickK
quelle
1
Entspricht dem obigen Kommentar. Bei den meisten JPG-Dateien ist das Datum in die von der Kamera hochgeladenen Metadaten eingebettet. Dies funktioniert (mit sed kann das Datum in das Format touch konvertiert werden): 'touch -d $ (identifiziere -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
Gaoithe
-6

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

Vampiremac
quelle
3
Snej sucht nach einer Batch- oder Befehlszeilenlösung, mit der mehrere Dateien geändert werden können. Das Ändern der Systemzeit und des Datums sowie das Ändern der Dateien ist wahrscheinlich keine ideale Lösung.
Fabricator4
zu viel triiiiiiicky !!!
Philippe Gachoud
Für diejenigen mit anderen Betriebssystemen, die über die Websuche hierher gebracht wurden, ist diese Antwort die einfachste Möglichkeit, das Datum einer Datei unter Mac OSX zu ändern ('touch -d' führt zu 'illegaler Option').
Alaning
1
@alanning: OSX hat BSD-Touch, nicht GNU-Touch. Verwenden Sie -t. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Dominik R
Das kann unvorhergesehene Folgen haben. In einem modernen Betriebssystem werden hinter den Kulissen ständig viele Dateien geändert. Während Ihr Datum geändert wird, können viele andere Dateien falsche Datumsstempel erhalten und alles kann passieren, wenn etwas anderes im System feststellt, dass eine Datei älter als erwartet ist.
Joe