Erstellungsdatum der Stapeländerung basierend auf Dateinamen

4

Ich habe Dateien mit dem Namen "12. 2017-04-11 063118.jpg" und "123. 2016-09-05 115236.jpg". Die Zahl links vom "." zählt wie ein Index von 1 bis 1400.

Wie kann ich das Erstellungsdatum und die Erstellungszeit gemäß der Angabe im Dateinamen für alle 1400 Dateien im Ordner einstellen? Ich weiß, dass der Befehl touch -t das Erstellungsdatum ändert, aber ich weiß nicht, wie ich die Datums- / Zeitinformationen aus dem Dateinamen extrahieren und in einen Befehl einfügen kann, sodass dies automatisch für alle Dateien durchgeführt wird.

Ich weiß aus einem anderen Thread, dass das untenstehende funktionieren sollte. Aber ich weiß nicht, wie ich die Textkonvertierung optimieren soll, um sie korrekt auf meine Dateinamenskonvention anzuwenden.

for f in *; do
    t=$(echo $f | sed -E 's/([A-z]*-)|([ ,;])|(\..*)//g' | sed -E 's/(.*)(..)/\1.\2/')
    touch -t $t "$f"
done

Der obige Code funktioniert, wenn meine Dateinamenskonvention wie folgt lautet: "clip-2014-01-31 18; 50; 15.mp4". Ich habe jedoch ein anderes Format: "12. 2017-04-11 063118.jpg" und "123. 2016-09-05 115236.jpg". Kann jemand den sedFunktionsbefehl zwicken, um die Umwandlung in das korrekte Format für Note zu verarbeiten?

Brent
quelle

Antworten:

6

Die Bash-Parameter-Erweiterung funktioniert wie folgt:

for f in *; do
    t="${f#* }"
    t="${t%%.*}"
    t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"
    touch -t $t "$f"
done
  • t="${f#* }"streift das Teil vorher ab (<das erste Leerzeichen)
  • t="${t%%.*}" streift das teil danach ab .
  • t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}" formatiert den Inhalt der Datumsvariablen (t) für Berührungen, für die das folgende Format erforderlich ist: [[CC] YY] MMDDhhmm [.SS].

Und als Einzeiler:

for f in *; do t="${f#* }"; t="${t%%.*}"; t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"; touch -t $t "$f"; done
klanomath
quelle
Das bare *(glob) listet jedes Dateisystemobjekt im Verzeichnis auf. Denken Sie, dass die Verwendung *.jpgeine bessere Wahl wäre?
fd0
@ fd0 Die Lösung funktioniert nur für das angegebene Format something_without_spaces YYYY[.|-|:]MM[.|-|:]DD hhmmSS.someextension. Das Erstellungsdatum wird nicht geändert, wenn das erforderliche Format CCYYMMDDhhmm.SS falsch ist (z. B. Buchstaben enthält oder der Punkt fehlt).
klanomath
3

Da Sie gefragt haben, wie Sie das, was Sie bereits hatten, optimieren können, würden Sie die Erfassungsgruppen beim ersten Auftreten von so ändern sed, dass sie mit dem neuen Muster übereinstimmen, während Sie die zweite sedunverändert lassen. Auch Doppel zitieren die $fin echo "$f" |.

Beachten Sie jedoch, dass ich die Verwendung der Pipe und das zweite Vorkommen von sed, | sed ...durch die Verwendung der -eOption beseitigt habe, mit der die Bearbeitungsbefehle in eine Liste von Befehlen eingefügt werden.

for f in *; do
    t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/\1.\2/')
    touch -t $t "$f"
done

Hier ist es als Einzeiler optimiert:

for f in *; do t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/\1.\2/'); touch -t $t "$f"; done

Hier ist eine Erläuterung der Erfassungsgruppen im ersten sedBearbeitungsbefehl:

Bildbeschreibung hier eingeben

Was Sie mit 20160905115236dem zweiten sedBearbeitungsbefehl belässt und von ihm verarbeitet wird 201609051152.36, (.*)(..)zerfällt in zwei Erfassungsgruppen, wobei die zweite die letzten beiden Zeichen und die erste alles andere enthält. Das .wird in den Ersetzungsabschnitt gestellt, in dem /\1.\2/beide Erfassungsgruppen rückverweist sind.

user3439894
quelle
0

Wenn die Dateien Exit-Tags enthalten, kann das kostenlose 'exiftool' den Dateinamen entsprechend den Werten in der Datei ändern. Wenn Sie es installieren, wird auch eine ausführliche Manpage installiert.

http://www.sno.phy.queensu.ca/~phil/exiftool/

Ich habe dieses Tool nicht nur zum Ändern von Dateinamen verwendet, sondern auch zum Schreiben von HTML-Ausschnitten, um die Dateien auf einer Webseite anzuzeigen.

WGroleau
quelle
OK, mein Schlimmes. Wenn Sie es noch einmal lesen, werden Sie feststellen, dass Sie die Dateidaten ändern möchten, nicht den Namen. Es kann sein, dass exiftool das kann. Mein MAC funktioniert nicht, daher kann ich die Manpage nicht lesen.
WGroleau