ubuntuusers.de

touch

Status: Gelöst | Ubuntu-Version: Xubuntu 12.04 (Precise Pangolin)
Antworten |

schneibva

Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 508

Wohnort: Franken

Ich habe etliche Dateien (>100), bei denen der Zeitpunkt der Entstehung falsch ist, dieser Zeitpunkt ist für die Auswertung wichtig. Der Rechner lief mit der local time, er sollte aber mit UTC laufen, d.h. ich muss bei allen Dateien die Zeitangabe der Entstehung um eine Stunde zurückstellen.

Klar, dazu gibt es touch. Aber >100 Dateien per Hand modifizieren? Kann man das irgendwie automatisieren?

Vej Team-Icon

Moderator, Supporter
Avatar von Vej

Anmeldungsdatum:
7. März 2013

Beiträge: 3400

Hallo schneibva,

du solltest dir mal find anschauen. Insbesondere die Schalter -amin und -execdir.

Meine (noch unausgegorene) Idee dahinter: Ich denke mit dem ersten Schalter solltest du alle Dateien finden können, die seit dem Hochfahren benutzt wurden und mit dem zweiten Schalter kannst du dann automatisch touch mit den modifizierten Werten ausführen.

Das nur so als Anregung.

Viele Grüße

Vej

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

touch kann das Entstehungsdatum nicht ändern, nur das Zugriffs- (atime) und das Änderungsdatum (mtime).

Die meisten Dateisysteme unter Linux speichern das Entstehungsdatum nicht, standardisiert ist zusätzlich zu den beiden obigen nur noch das Inode-Änderungsdatum (ctime), d.h. das Datum der letzten Änderung von Dateirechten o.ä.

Mooi

Anmeldungsdatum:
15. August 2014

Beiträge: 187

Kann so aussehen:

#!/bin/bash

while read -rd '' line; do
    mtime=${line%% *}
    file="${line#* }"
    newtime=$(($mtime-3600))
    touch -d @$newtime "$file"
done < <(find -name "*" -type f -exec stat --printf "%Y %n\0" {} +)

Das find solltest Du Dir anpassen (dazu das -name "*", das hier überflüssig ist, aber nicht falsch).

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 508

Wohnort: Franken

diesch schrieb:

touch kann das Entstehungsdatum nicht ändern, nur das Zugriffs- (atime) und das Änderungsdatum (mtime).

Ich vergass zu erwähnen, dass der Datenträger mit FAT32 formatiert ist. Es sollen alle dateien im Verzeichnis geändert werden

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 508

Wohnort: Franken

Ich habe das Script von Mooi (vielen Dank) mal laufen lassen, Fehler

bash: ./new.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Ich habe dann mal die "" in der Zeile

file="${line#* }"

weg gemacht, gleicher Fehler.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

schneibva schrieb:

Ich habe das Script von Mooi (vielen Dank) mal laufen lassen, Fehler

bash: ./new.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Wo kommt denn das "^M" her?

Vej Team-Icon

Moderator, Supporter
Avatar von Vej

Anmeldungsdatum:
7. März 2013

Beiträge: 3400

snafu1 schrieb:

schneibva schrieb:

Ich habe das Script von Mooi (vielen Dank) mal laufen lassen, Fehler

bash: ./new.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Wo kommt denn das "^M" her?

Meiner Erfahrung nach ist das meistens ein Windows-Zeilenumbruch in der Shell. Fragt mich jetzt aber bitte nicht, warum der als ^M dargestellt wird.

Zum Problem: schneibva schrieb:

bash: ./new.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Da würde ich jetzt vermuten, das der Bash-Interpreter nicht in /bin/bash installiert ist. Kannst du mal versuchen die Ausgabe von

which bash 

zu posten?

Vielen Dank

Vej

g00d.morning

Anmeldungsdatum:
20. Februar 2013

Beiträge: 330

Vej schrieb:

snafu1 schrieb:

schneibva schrieb:

Ich habe das Script von Mooi (vielen Dank) mal laufen lassen, Fehler

bash: ./new.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Wo kommt denn das "^M" her?

Meiner Erfahrung nach ist das meistens ein Windows-Zeilenumbruch in der Shell. Fragt mich jetzt aber bitte nicht, warum der als ^M dargestellt wird.

Siehe: Zeilenumbruch

Zum Problem: schneibva schrieb:

bash: ./new.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Da würde ich jetzt vermuten, das der Bash-Interpreter nicht in /bin/bash installiert ist. Kannst du mal versuchen die Ausgabe von

which bash 

zu posten?

Mach es nicht unnötig kompliziert. Auch Dein System wird unter /bin/bash^M nichts finden 😉

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Ist das Bash-Skript etwa auf der Windows-Partition abgespeichert worden? 😮

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 508

Wohnort: Franken

/bin/bash ist vorhanden

Das Skript ist auf der Platte, die mit FAT32 formatiert worden ist.

Das ^M soll vermutlich das CR (&h0D) darstellen (ist der 13. Buchstabe im (Alphabet).

Hilft mir bloss alles nichts, auch wenn im Skript kein CR (&h0D) drin ist, geht es nicht.

bash: ./new.sh: Datei oder Verzeichnis nicht gefunden

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

schneibva schrieb:

Hilft mir bloss alles nichts, auch wenn im Skript kein CR (&h0D) drin ist, geht es nicht.

bash: ./new.sh: Datei oder Verzeichnis nicht gefunden

Diese Fehlermeldung zeigt jetzt aber an, dass das Skript an sich nicht gefunden wird. Demzufolge rufst du das Skript offenbar von einem Ort auf, an dem new.sh halt nicht im selben Verzeichnis abgelegt wurde.

schneibva

(Themenstarter)
Avatar von schneibva

Anmeldungsdatum:
25. Dezember 2006

Beiträge: 508

Wohnort: Franken

autsch, das tut weh!

Mooi

Anmeldungsdatum:
15. August 2014

Beiträge: 187

Man kann auch einen (schwer lesbaren) Einzeiler draus machen und ihn einfach ins Terminal kopieren:

while read -rd '';do touch -d @$((${REPLY%% *}-3600)) "${REPLY#* }";done< <(find -name "*" -type f -exec stat --printf "%Y %n\0" {} +)

Dann muss man aber vorher sicherstellen, dass eine Bash läuft (ist meistens der Fall).

Antworten |