Shell: Erstell-Datum als Dateiname

Hallo.

Ich suche ein Skript mit welchem ich alle Dateien in einem Ordner durchgehe und sie so benenne wie das Datum an dem sie erstellt wurden.
Diese Dateien möchte ich dann noch archivieren und so weiter, aber das bekomm ich denk ich noch alleine hin, aber es klemmt eben an dem Datum.

Kann mir dabei einer weiterhelfen?

Gruß, Andreas

Hallo.

Ich suche ein Skript mit welchem ich alle Dateien in einem
Ordner durchgehe und sie so benenne wie das Datum an dem sie
erstellt wurden.
Diese Dateien möchte ich dann noch archivieren und so weiter,
aber das bekomm ich denk ich noch alleine hin, aber es klemmt
eben an dem Datum.

Kann mir dabei einer weiterhelfen?

Was ist, wenn zwei Dateien am selben Tag erstellt wurden?

Auf der shell kannst Du das Datum in eine Variable packen, indem Du sie mit

DATE=`date +%Y%m%d`

definierst. Später kannst Du dann mittels $DATE darauf zurückgreifen, bspw. beim archivieren.

Gruß,

Malte

Was ist, wenn zwei Dateien am selben Tag erstellt wurden?

Das ist an sich nicht möglich.

Auf der shell kannst Du das Datum in eine Variable packen,
indem Du sie mit

DATE=date +%Y%m%d

definierst. Später kannst Du dann mittels $DATE darauf
zurückgreifen, bspw. beim archivieren.

Ok, dazu fallen mir 2 weitere Fragen ein:
1.
Ich hätte das gern per Pipes in eine einzige Abfrage geschrieben
Beispiel1: ls *.log.gz | DATE=date +%Y%m%d
… hier wird leider bei date nicht der „gepipete“ Name genommen.
Beispiel2: FILENAME=ls *.log.gz | DATE=date $FILENAME +%Y%m%d
…und hier ist FILENAME ein String aus allen Namen mit Leerzeichen getrennt…
Wie kann ich die Probleme beheben?

Ist das auch wirklich das Erstellungsdatum oder doch eher das der letzten Änderung?

Gruß, Andreas

Hallo,

Was ist, wenn zwei Dateien am selben Tag erstellt wurden?

Das ist an sich nicht möglich.

Nadann ist ja gut :wink:

Ich hätte das gern per Pipes in eine einzige Abfrage
geschrieben
Beispiel1: ls *.log.gz | DATE=date +%Y%m%d
… hier wird leider bei date nicht der „gepipete“ Name
genommen.

und das Datum welcher Datei willst du dann in DATE haben?
Wie wärs mit

for i in \*.log.gz; do DATE=`date +%Y-%m-%d -r "$i"`; mv "$i" $DATE.log.gz;done

oder so?

Ist das auch wirklich das Erstellungsdatum oder doch eher das
der letzten Änderung?

Laut manapge ist es die „modification time“, aber bei mir zumindest wird nur modification, change und access gespeichert:

$ stat env
 File: `env'
 Size: 1505 Blocks: 8 IO Block: 4096 regular file
Device: 305h/773d Inode: 263884 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ moritz) Gid: ( 1000/ moritz)
Access: 2006-09-08 10:51:04.000000000 +0100
Modify: 2006-09-08 10:51:04.000000000 +0100
Change: 2006-09-08 10:51:04.000000000 +0100

(NB: ich hab das Laufwerk mit noatime gemountet, daher ist access = mofify).

Oder kennt jemand eine andere Möglichkeit, das Erstellungsdatum festzustellen?

Grüße,
Moritz

Oder kennt jemand eine andere Möglichkeit, das Erstellungsdatum festzustellen?

Da bei den meisten Filesystemen die abrufbaren Informationen sich auf „last access“ und „last modification“ beschränken, kann man dort m.E.n. nicht viel machen wenn die Datei erst einmal existiert.

Bestimmte Dateien, wie zB Word-Dokumente, enthalten einen Block, der ihr Ersterstellungsdatum speichert. Dies könnte man abfragen.

Oder wenn es sich um gut erstellte Log Files handelt, sollte jede Zeile einen Zeitstempel anhängen haben, dann könnte man mit head -1 in der ersten Zeile danach suchen.

Ansonsten fällt mir jetzt auch nicht mehr ein, als geschickterweise direkt bei der Erstellung den Datumsstempel anzuheften, was natürlich nur bei zukünftigen Dateien möglich ist.

Hinweis: Auf der Wikipedia mal nach „Dateiattribute“ suchen:
http://de.wikipedia.org/wiki/Dateiattribute

(wobei da auch nicht mehr steht als was schon erwähnt wurde)

Gruss,
Michael

Wie wärs mit

for i in *.log.gz; do DATE=date +%Y-%m-%d -r "$i"; mv
„$i“ $DATE.log.gz;done

oder so?

Nun hab ich endlich mal die Zeit gefunden das zu machen und es läuft prima. Danke nochmal!
Eine kleine Frage hab ich aber noch:
Kann man bei

for FILE in \*

noch irgendwie was ignorieren wie zB bei

ls \* -I irgendwas

?

Grüße, Andreas