Frage Wie kann ich das Änderungsdatum einer Datei ändern?


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.).


192
2017-09-22 05:32


Ursprung




Antworten:


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

touch filename

Standardmäßig wird die Änderungszeit der Datei auf die aktuelle Zeit gesetzt, es gibt jedoch eine Reihe von Flags, z -d Wählen Sie ein bestimmtes Datum aus. 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 ändern zu find Wählen Sie nur die Dateien aus, an denen Sie interessiert sind. Wenn Sie nur die Änderungszeiten der Datei relativ zur aktuellen Zeit aktualisieren möchten, können Sie dies 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 zu bilden touch.

Soweit es die Erstellungszeit betrifft, verfolgen die meisten Linux-Dateisysteme diesen Wert nicht. Da ist ein ctime mit Dateien verknüpft, aber es verfolgt, wenn die Dateimetadaten zuletzt geändert wurde. 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, hat also auch den Nebeneffekt der Aktualisierung der ctime.


259
2017-09-22 06:34



Um den einfacheren Fall zu erwähnen, wenn sich alle Dateien in demselben Ordner befinden: touch -d "2 hours ago" /path/*.txt, beispielsweise. - enzotib
Ich würde auch hinzufügen, dass das ändern ctime ist in keiner üblichen Weise möglich. - arrange
Ist das alles POSIX? - user1011471
Die Information über ctime als Zeit für die Änderung der Metadaten ist von POSIX. Ich weiß nicht, ob die Shell-Fragmente in meiner Antwort mit strikten POSIX-Shell-Utilities funktionieren würden. Aber sie arbeiten definitiv auf Ubuntu, dem Kontext für Antworten auf dieser Seite. - James Henstridge
touch: illegal option -- d - User


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

Im Terminal gehen Sie zum Verzeichnis für das Datum-Editieren. Dann tippe:

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

Sie sehen ein ">", nachdem Sie Enter gedrückt haben, mit Ausnahme des letzten Mals -> "done".

Hinweis:  Vielleicht möchten Sie "201203101513" ändern

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

Siehe meine Webseite


40
2018-03-10 14:21



Es funktioniert nicht wie erwartet, wenn ein Dateiname Leerzeichen enthält - Angel


Einfachster Weg - Zugriff und Änderung werden gleich sein:

touch -a -m -t 201512180130.09 fileName.ext

Woher:

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

Wenn Sie verwenden möchten NOW einfach fallen lassen -t und der Zeitstempel.

Um zu überprüfen, sind sie alle gleich: stat fileName.ext

Sehen: berühre den Menschen


22
2017-12-19 14:58



Ich habe versucht, es mit stat zu überprüfen, aber keiner der touch Flags führen zu einem korrekten Ergebnis. Das Änderungsdatum wird angepasst, aber das geänderte Datum und das Datum des Zugriffs werden auf JETZT geändert - Xerus


Touch kann auf das Datum einer Datei selbst verweisen und muss nicht aufgerufen werden date oder verwenden Sie die Befehlsersetzung. 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 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 mit einem * und lassen for wähle die Dateinamen selbst aus sicherer, aber mit find -print0 | xargs -0 touch ...  sollte handhaben die meisten verrückte Zeichen wie Zeilenumbrüche, Leerzeichen, Anführungszeichen, umgekehrte Schrägstriche in einem Dateinamen. (PS. Versuchen Sie nicht, verrückte Zeichen in Dateinamen zu verwenden).

Zum Beispiel, um alle Dateien zu finden thatdirderen Dateinamen mit einem beginnen s, und fügen Sie einen Tag zum modifizierten Zeitstempel dieser Datei hinzu, verwenden Sie:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'

6
2017-12-17 14:52





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

2
2017-08-06 19:40



Das Datum der Bilder basierend auf Metainformationen im Bild anzupassen, wäre ziemlich nützlich. Die ImageMagick-Kennung kann verwendet werden. z.B. 'identify -verbose <Bild> | grep -i date', 'identify -format% [exif: DateTime] <Bild>' zeigt möglicherweise '2015: 01: 08 10:19:10' an (nicht alle Bilder haben Exif-Daten) . Dies funktioniert (mit sed, um das Datum in das Format touch zu konvertieren): 'touch -d $ (identify -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ;) $ f ' - gaoithe


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

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

Ich habe ein Skript geändert, das ich hier gefunden habe, 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 in 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 generische 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 = dein-Dateiname-das-ist-dein-Befehl

Beispiel

./fn *.JPG

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


1
2018-01-04 23:28



Gleich wie oben. Bei den meisten .jpg-Dateien wird das Datum in Metadaten eingebettet, die von der Kamera gespeichert werden. Dies funktioniert (mit sed, um das Datum in das Format touch zu konvertieren): 'touch -d $ (identify -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ;) $ f ' - gaoithe


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


-6
2017-11-28 08:37



Snej sucht nach einer Batch- oder Befehlszeilenlösung, mit der mehrere Dateien geändert werden können. Das Ändern von Systemzeit und -datum und das Ändern der Dateien ist wahrscheinlich keine ideale Lösung. - fabricator4
zu viel triiiiiiicky !!! - Philippe Gachoud
Für diejenigen, die mit anderen Betriebssystemen ü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 einer "illegalen Option"). - alanning
@alanning: OSX hat BSD touch, nicht GNU touch. Verwenden Sie -t. Entwickler.apple.com/library/mac/documentation/Darwin/Reference/... - Dominik R
Das kann unvorhergesehene Konsequenzen haben. In einem modernen Betriebssystem werden viele Dateien ständig hinter den Kulissen verä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 bemerkt, dass eine Datei älter ist als erwartet. - Joe