Speicherdatum in Dateinamen einfügen

Ich möchte gern das Speicherdatum einer Datei, das ich mir zB mit ls -l ausgeben lassen kann, in den Dateinamen übernehmen, also die Datei mit einem entspr. Shell-Script umbenennen.

Ich habe schon gesehen, dass man üblicherweise das aktuelle Datum in den Dateinamen einfügen kann mit:
mv Dateiname.ext $(date +’%Y%m%d’).ext
Habe aber nicht gefunden, wie man das erste/letzte Speicherdatum einer Datei „ausliest“, habe evtl. auch nicht die richtigen Suchbegriffe dafür.

Vielen Dank für Tipps,

quad

Habe aber nicht gefunden, wie man das erste/letzte
Speicherdatum einer Datei „ausliest“, habe evtl. auch nicht
die richtigen Suchbegriffe dafür.

stat gibt detaillierte Dateiinformationen aus, z. B. stat -c%z das letzte Änderungsdatum. Um die Date altername nach neu_[DATUM].xyz umzubenennen, benötigst du den rename-Befehl:

rename „s/altername/neu_stat -c%z altername.xyz/“ altername

Wichtig ist der Befehl stat -c%z altername und dessen Umklammerung in Backticks (`). Allerdings hat die Datumsausgabe ein vorgegebenes Format, der Dateiname lautet jetzt ähnlich wie

neu_2010-05-15 23:48:29.611613321 +0200.xyz

Wenn die Uhrzeit unerwünscht ist oder in einem anderen Format dargestellt werden soll, benötigst du einen zweiten rename-Befehl, z. B.:

rename „s/ .* +…//“ neu_*.xyz

Übrig bleibt dann „neu_2010-05-1600.xyz“. Da sind jetzt noch zwei Nullen zu viel drin, irgendwas stimmt also im zweiten rename noch nicht. Das kriegst du aber selber raus, für mich ist jetzt Bett.

Möglicherweise kannst du mit Hilfe komplexerer Regular Expressions das ganze auch in einem einzigen Befehl realisieren.

HTH

Vielen Dank für die Antwort zu so später Stunde.

Irgendetwas funktioniert aber nicht an dem Befehl:

rename „s/altername/neu_stat -c%z altername.xyz/“ altername

Ich erzeuge also eine Beispieldatei mit
>touch datei1
und gebe dann ein:
>rename „s/datei1/neu_stat -c%z datei1.xyz/“ datei1
Aber die gewünschte Umbenennung ist nicht erfolgt:
>ls -l
-rw-r–r-- 1 family family 0 2010-05-17 22:11 datei1

Habe ich was falsch gemacht?

Was mir auch noch ein wenig schleierhaft ist, wie sich die Syntax der Suchmuster zusammensetzt, also wieso "s/altername/neu_ … steht? Muss da nicht ein $ mit rein?
Ist das irgendwo anschaulich beschrieben? (man-page? bei man rename steht dazu leider nichts)

Viele Grüße,
quad

>touch datei1
und gebe dann ein:
>rename „s/datei1/neu_stat -c%z datei1.xyz/“ datei1

Bekommst du an der Stelle irgendeine Fehlermeldung? Hast du den stat-Befehl an sich auf deinem System mal getestet? stat -c%z *

Statt mit Backticks kannst du ein Kommando auch anders klammern: $(Kommando). Allerdings sollten beide Ausdrucksweisen gleichwertig sein (Nebenbei: was für eine Shell nutzt du?):
rename „s/datei1/$(stat -c%z datei1)/“ datei1

Hier kannst du natürlich genauso auch den move-Befehl verwenden:
mv datei1 „neu_$(stat -c%z datei1).xyz“

  • oder -
    mv datei1 „neu_stat -c%z datei1.xyz“

Habe ich was falsch gemacht?

Nö, deine Befehle sind bei mir per copy&paste nachvollziehbar und führen zum gewünschten Erfolg.

Was mir auch noch ein wenig schleierhaft ist, wie sich die
Syntax der Suchmuster zusammensetzt, also wieso
"s/altername/neu_ … steht? Muss da nicht ein $ mit rein?

Der $ nur als Einleitung des Kommandos, wenn du die Form $(Kommando) benutzt anstelle Kommando. Ich bastel mal ein einfacheres Beispiel: Die Datei test soll das aktuelle Datum als Name erhalten:

touch test
rename "s/test/$(date)/" test
 _| | | |  
 | | | in allen Dateien mit Namen test  
 | | mit dem Ergebnis des Befehls 'date'  
 | den Ausdruck Test  
 Ersetze_  
ls
-rw-r--r-- 1 schorsch schorsch 0 18. Mai 00:14 **Di 18. Mai 00:14:59 CEST 2010**

Ist das irgendwo anschaulich beschrieben? (man-page? bei man
rename steht dazu leider nichts)

In der Perl-Dokumentation, im Kapitel ‚Regular Expressions‘. Wenn du mal ein paar Monate Zeit hast…

HTH

Hast du
den stat-Befehl an sich auf deinem System mal getestet? stat
-c%z *

Ja, der stat-Befehl funktioniert.

Nebenbei: was für eine Shell nutzt du?:

Ich benutze GNU Bash 4.0 (so steht es jedenfalls im Paketmanager meines Mandriva Linux 2010. Ich nehme an, die Shell-Version bekommt man auch mit einem einfachen Konsolenbefehl heraus, oder?)

rename „s/datei1/$(stat -c%z datei1)/“ datei1

Seltsamerweise funktioniert der rename Befehl so nicht, es gibt keinerlei Fehlermeldung, und die Datei wird schlicht nicht umbenannt.

Hier kannst du natürlich genauso auch den move-Befehl
verwenden:
mv datei1 „neu_$(stat -c%z datei1).xyz“

  • oder -
    mv datei1 „neu_stat -c%z datei1.xyz“

Beide Versionen des mv-Befehls funktionieren. Aber wie bekomme ich nun mit mv die Uhrzeit raus? Mit rename „s/ .* +…//“ neu_*.xyz geht es nicht.

Viele Grüße,
quad

Beide Versionen des mv-Befehls funktionieren. Aber wie bekomme
ich nun mit mv die Uhrzeit raus? Mit rename „s/ .* +…//“
neu_*.xyz geht es nicht.

Move kann keine regexes. Ohne den rename-Befehl (oder eigene Programmierung) bist du in dieser Hinsicht aufgeschmissen. Die GNU bash muss das eigentlich können; möglicherweise enthält deine Version (oder die des rename) einen Bug. Ich habe meine Beispiele unter Debian stable, GNU bash Version 3.2.39(1) getestet.

Funktioniert der rename_Befehl denn grundsätzlich auf deinem System?

Gruß