2010-11-18 6 views
0

Ich versuche, den Zeitstempel aller Dateien in einem Verzeichnisbaum um eine Stunde zu erhöhen (um die Änderung der Sommerzeit zu korrigieren). Nach viel Basteln und Suchen habe ich herausgefunden, wie man es mit Find, Stat und Touch macht, aber wenn ich alles in einem Befehl zusammenfasse, scheitert es. lautet der Befehl:Wie stelle ich Fund, Stat und Touch zusammen?

find ~/dir -type f -exec touch -m --date="$(stat -c '%y' '{}') + 3600 sec" '{}' \; 

oder alternativ mit args:

find $DIRNAME -type f -print0 | xargs -0 touch -m --date="$(stat -c '%y' '{}') + 3600 sec" 

aber es funktioniert nicht und gibt einen Fehler: stat: can not stat `{} ': Keine solche Datei oder das Verzeichnis

Ich habe meinen Kopf an dieser Wand für einen halben Tag geschlagen. Irgendein Vorschlag?

Antwort

1
find $DIRNAME -type f | 
    while read file; do 
     touch -m --date="$(stat -c '%y' "$file") + 3600 sec" 
    done 
0

Versuchen Sie folgendes:

find . -type f | while read line; do NEW_TS=`date [email protected]$((\`stat -c '%Y' $line\` + 3600)) '+%Y%m%d%H%M.%S'`; touch -t $NEW_TS ${line}; done 
0

Vielen Dank, Chris! Eigentlich sollte es eine "$ Datei" am Ende sein (mit den Anführungszeichen oder es wird Dateinamen mit Leerzeichen ignorieren, nicht sicher warum), aber ansonsten scheint es zu funktionieren.

find $DIRNAME -type f | 
    while read file; do 
     touch -m --date="$(stat -c '%y' "$file") + 3600 sec" "$file" 
    done 
0

Dies wird es tun

find $DIRNAME -type f -exec bash -c 'touch -m --date="$(stat -c %y "$1") + 3600 sec" "$1"' -- {} \; 

Das Problem ist, dass -exec eine harte Zeit Ortung {} hat, manchmal, und wenn Ihre -exec Verwendungen + anstelle von \; es erlaubt nur einmal. In solchen Fällen ist es am einfachsten, bash aufzurufen und jedes Ergebnis zu übergeben, was ich oben getan habe.

All dies erreicht in diesem Fall wirklich die Lese/While-Schleife anderer Lösungen zu vermeiden, aber in einigen Fällen ist es eine wesentliche Technik.

+0

Dateizeiten sind Epochen Sekunden. Eine Änderung der Sommerzeit kann die Zeit, die Zeit oder die Zeit einer Datei nicht ändern. Haben Sie die Systemzeit zurückgesetzt, um die Zeitänderung zu kompensieren? –

+0

Ich beziehe mich nicht auf die Richtigkeit des Ansatzes des ursprünglichen Posters, um sein ursprüngliches Problem zu lösen, ich zeige nur, wie man diese Werkzeuge kombiniert. – Sorpigal

1

Die Fehlermeldung aus Ihrem zweiten Beispiel war, weil Sie xargs -I {} nicht verwendet haben. Um zu vermeiden, dass Dinge vorzeitig ausgewertet werden, übergeben Sie den Befehl in einfachen Anführungszeichen an sh.

find $DIRNAME -type f -print0 | xargs -0 -I {} sh -c 'touch -m --date="$(stat -c '%y' "{}") + 3600 sec" "{}"' 
0

Ich bin das Originalplakat. Danke allen für die Tipps und Erklärungen. Nur um zu verdeutlichen, warum ich das mache. Die Änderung der Sommerzeit hat sich auf eine externe FAT-Festplatte ausgewirkt, die ich zum Übertragen von Daten zwischen Windows-, Mac- und Linux-Systemen verwende, und so mein Rsync vermasselt. Ich dachte, es wäre einfacher und schneller, die Zeit aller Dateien zu ändern, als alles zu kopieren (vielleicht nicht, aber das ist für einen anderen Thread, denke ich)