Datei-Eigenschaften auslesen
Datei-Eigenschaften auslesen
Hallo zusammen!
ich möchte ein Script erstellen, welches alle Dateien in einem Verzeichnis nach jeweils dem Datum und Uhrzeit der Datei umbenennt. Das heißt zum Beispiel, in einem Verzeichnis ist unter anderem die Datei "file1.jpg", die am 06.12.2003 um 13:45:11 geändert (oder erstellt?) wurde.
Diese Datei möchte ich nun (wie alle anderen auch) am Besten so umbenennen, dass sie dann 2003.12.06-13.45.11.jpg heißt.
Alles was ich rausfinden konnte war, dass ich mit dem Befehl
ls -l file1.jpg | awk '{print $6"."$7}'
den zukünftigen Datei-Namen FAST richtig auslesen konnte. Allerdings scheitere ich hierbei an 2 Dingen:
1. Der Datei-Name hätte dann " : " in der Uhrzeit, jedoch kann das ein FAT-Dateisystem nicht, wo sie eigentlich mit kompatibel sein sollen. (Daher würde mir das Format wie 2003.12.06-13.45.11.jpg sehr gut gefallen).
2. Wie kann ich den Befehl in ein Script einbinden. (Unter Windows habe ich so ein Programm schon geschrieben, aber mit Linux muss ich es noch lernen)
Also, ich freue mich auf alle Antworten sehr!!
Vielen Dank
Grüße
GSB
ich möchte ein Script erstellen, welches alle Dateien in einem Verzeichnis nach jeweils dem Datum und Uhrzeit der Datei umbenennt. Das heißt zum Beispiel, in einem Verzeichnis ist unter anderem die Datei "file1.jpg", die am 06.12.2003 um 13:45:11 geändert (oder erstellt?) wurde.
Diese Datei möchte ich nun (wie alle anderen auch) am Besten so umbenennen, dass sie dann 2003.12.06-13.45.11.jpg heißt.
Alles was ich rausfinden konnte war, dass ich mit dem Befehl
ls -l file1.jpg | awk '{print $6"."$7}'
den zukünftigen Datei-Namen FAST richtig auslesen konnte. Allerdings scheitere ich hierbei an 2 Dingen:
1. Der Datei-Name hätte dann " : " in der Uhrzeit, jedoch kann das ein FAT-Dateisystem nicht, wo sie eigentlich mit kompatibel sein sollen. (Daher würde mir das Format wie 2003.12.06-13.45.11.jpg sehr gut gefallen).
2. Wie kann ich den Befehl in ein Script einbinden. (Unter Windows habe ich so ein Programm schon geschrieben, aber mit Linux muss ich es noch lernen)
Also, ich freue mich auf alle Antworten sehr!!
Vielen Dank
Grüße
GSB
Zum Script selbst kann ich Dir nicht helfen. Aber 2 Anmerkungen:
- Kann FAT den '2003.12.06-13.45.11.jpg' umgehen? Das entspricht doch nicht dem 8.3 Schema. Allerdings ist es schon ewig her, das ich eine der vielen FAT Spielarten verwendet hab. Und neuere können das eventuell.
- Was machst Du, wenn 2 Dateien gleichen Datums existieren? Paß auf, as Du nicht eine Datei dabei überschreibst. Unixe fragen da nicht viel
- Kann FAT den '2003.12.06-13.45.11.jpg' umgehen? Das entspricht doch nicht dem 8.3 Schema. Allerdings ist es schon ewig her, das ich eine der vielen FAT Spielarten verwendet hab. Und neuere können das eventuell.
- Was machst Du, wenn 2 Dateien gleichen Datums existieren? Paß auf, as Du nicht eine Datei dabei überschreibst. Unixe fragen da nicht viel
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de
xmpp:bert@debianforum.de
Jo, das sollte bei einem FAT32 kein Problem sein. Mehr als 8 Zeichen sind sowieso erlaubt und AFAIK auch mehrere Punkte.Bert hat geschrieben:Kann FAT den '2003.12.06-13.45.11.jpg' umgehen? Das entspricht doch nicht dem 8.3 Schema. Allerdings ist es schon ewig her, das ich eine der vielen FAT Spielarten verwendet hab. Und neuere können das eventuell.
Hallo, hab da mal schnell was zusammengefrickelt:
Das Script kannst du nun zum Beispiel rename.sh nennen und dann mit
alle jpg Dateien umbenennen.
Ich übernehme natürlich keine Haftung für allfälligen Datenverlust. Ich habe es nur kurz bei mir ausprobiert und es hat funktioniert
Code: Alles auswählen
#!/bin/bash
for i
do
mv $i `ls --full-time $i |
awk '{
timestp = $7
gsub(/:/,".",timestp)
print $6"."timestp".jpg"}' `
done
Code: Alles auswählen
./rename.sh *.jpg
Ich übernehme natürlich keine Haftung für allfälligen Datenverlust. Ich habe es nur kurz bei mir ausprobiert und es hat funktioniert
Jabber: neptoon@jabber.org
It's only Rock'n'Roll but I like it
It's only Rock'n'Roll but I like it
Und wer es noch ein bisschen kryptischer mag, nimmt statt der mv-awk Zeile
Code: Alles auswählen
`find $i -printf "mv %p %CY.%Cm.%Cd-%CH.%CM.%CS.jpg"`
Ist natürlich auch eine Möglichkeit . Gefällt mir auch
Jabber: neptoon@jabber.org
It's only Rock'n'Roll but I like it
It's only Rock'n'Roll but I like it
Hi,
zu deinem ls Problem kann ich dir folgendes sagen:
Aber es gibt sicherlich bessere Lösungsansätze.
zu deinem ls Problem kann ich dir folgendes sagen:
Code: Alles auswählen
ls -l file1.jpg | awk '{print $6"."$7}'| sed -e "s/:/./"
- weedy
- Beiträge: 585
- Registriert: 02.11.2002 21:47:49
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Es gäbe dann noch die Variante:
weedy
Code: Alles auswählen
ls *.jpg| xargs -n1 -i date -r {} +"%Y.%m.%d-%H.%M.%S.jpg"
Diese ganzen regex, perl und awk Scripte sehen ja alle super toll aus. Aber das Problem mit 2 oder mehr Dateien mit gleichem Zeitstempel existiert ja weiter..
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de
xmpp:bert@debianforum.de
Für solche Fälle gibt es bei mv den backup Parameter :Bert hat geschrieben:Diese ganzen regex, perl und awk Scripte sehen ja alle super toll aus. Aber das Problem mit 2 oder mehr Dateien mit gleichem Zeitstempel existiert ja weiter..
Code: Alles auswählen
#!/bin/bash
for i
do
mv --backup=numbered $i `ls --full-time $i |
awk '{
timestp = $7
gsub(/:/,".",timestp)
print $6"."timestp".jpg"}' `
done
[ jabber ] chimerer@amessage.de
- weedy
- Beiträge: 585
- Registriert: 02.11.2002 21:47:49
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Der Backupparameter versagt, wenn mehr als 1 Datei mit demselben Zeitstempel versehen ist, denn von dem Backup wird nicht noch ein Bacup gemacht. Also muß man entweder in awk eine Zahl hochzählen und die dann mit an den Dateinamen pappen, oder man benutzt -i, da bekommt man wenigstens eine Warnung und kann dann die von Überschreiben bedrohte Datei vor dem Schreiben von Hand umbenennen :-). Leider habe ich so schnell keine Möglichkeit gefunden, 2 Inputstreams zeilenweise zu verketten, da hätte man nämlich auch 'seq' verwenden können. Wobei; man kann statt ls -l folgendes machen:Chimerer hat geschrieben:Für solche Fälle gibt es bei mv den backup Parameter ;):Bert hat geschrieben:Diese ganzen regex, perl und awk Scripte sehen ja alle super toll aus. Aber das Problem mit 2 oder mehr Dateien mit gleichem Zeitstempel existiert ja weiter..
Code: Alles auswählen
ls -l | cat -n
#liefert z.B:
185 -rw------- 1 crazy crazy 9617 Dec 10 23:48 mbox
186 drwxr-xr-x 2 crazy crazy 48 May 5 2003 mount
187 drwxr-xr-x 6 crazy crazy 208 Dec 16 09:24 mus
weedy.
Hallo!
Erstmal dickes Lob und vielen Dank für die Hilfe! Ihr habt ja genau das Problem gelöst das ich angegeben hatte.
Nun, was ich damit vor hatte, ist alle Bilddateien von meiner Digitalkamera mit einem Script auf Festplatte zu verschieben und gleichzeitig nach Datum und Uhrzeit umzubenennen!
Ich habe dieses Problem jetzt mit den 3 folgenden Scripten "gelöst":
(alle 3 Scripte liegen in /home/gsb/Fotos, zum Starten starte ich download.sh)
download.sh :
move.sh :
ext.sh :
( Mit --backup=t wird keine Datei mit dem selben Namen überschrieben, sondern durchnummeriert: es wird ein .~1~ , .~2~ , .~3~ an den Dateinamen gehängt. Das letzte Script hängt ein .jpg hintendran, damit es nicht do aussieht: datumurhzeit.jpg.~2~ besser -> datumurhzeit.~2~.jpg )
Das macht also EIGENTLICH alles was ich will, aber diese Lösung gefällt euch sicherlich so wenig wie mir, denn:
1. es ist nicht alles in EINEM Script untergebracht.
2. es werden zuerst alle Bilddateien in ein tmp-verzeichnis verschoben und dann erst in das Verzeichnis Fotos. Da sollten sie besser direkt hin verschoben werden.
3. Die Datei-Endung könnte auch ein .tif sein -> das möchte ich natürlich dann nicht in .jpg umwandeln. Also die Dateiendung sollte er übernehmen.
Erstmal dickes Lob und vielen Dank für die Hilfe! Ihr habt ja genau das Problem gelöst das ich angegeben hatte.
Nun, was ich damit vor hatte, ist alle Bilddateien von meiner Digitalkamera mit einem Script auf Festplatte zu verschieben und gleichzeitig nach Datum und Uhrzeit umzubenennen!
Ich habe dieses Problem jetzt mit den 3 folgenden Scripten "gelöst":
(alle 3 Scripte liegen in /home/gsb/Fotos, zum Starten starte ich download.sh)
download.sh :
Code: Alles auswählen
#!/bin/bash
# was soll kopiert werden:
/home/gsb/Fotos/move.sh /media/sda1/dcim/100olymp/*
/home/gsb/Fotos/ext.sh /home/gsb/Fotos/tmp/*
mv /home/gsb/Fotos/tmp/*.jpg /home/gsb/Fotos/
Code: Alles auswählen
#!/bin/bash
for i
do
`find $i -printf "mv --backup=t %p /home/gsb/Fotos/tmp/%TY.%Tm.%Td-%TH.%TM.%TS"`
done
Code: Alles auswählen
#!/bin/bash
for i
do
`find $i -printf "mv %p %p.jpg"`
done
Das macht also EIGENTLICH alles was ich will, aber diese Lösung gefällt euch sicherlich so wenig wie mir, denn:
1. es ist nicht alles in EINEM Script untergebracht.
2. es werden zuerst alle Bilddateien in ein tmp-verzeichnis verschoben und dann erst in das Verzeichnis Fotos. Da sollten sie besser direkt hin verschoben werden.
3. Die Datei-Endung könnte auch ein .tif sein -> das möchte ich natürlich dann nicht in .jpg umwandeln. Also die Dateiendung sollte er übernehmen.
Code: Alles auswählen
#!/bin/sh
for i in `ls $1/*`
do
`find $i -printf "mv --backup=t %p $2/%TY.%Tm.%Td-%TH.%TM.%TS.\`echo $i | cut -f2- -d"."\`"`
done
Code: Alles auswählen
./script.sh verzeichnis-mit-bildern/ zielverzeichnis/
was das gleiche wie --backup=numbered ist. Funktioniert also doch, weedy.Mit --backup=t wird keine Datei mit dem selben Namen überschrieben, sondern durchnummeriert: es wird ein .~1~ , .~2~ , .~3~ an den Dateinamen gehängt.
[ jabber ] chimerer@amessage.de
hmm, das sieht sehr gut aus, läuft aber leider nicht
also EINZELN läuft alles vor echo und echo mit allem dahinter läuft auch einzeln,
aber so wie es da steht läuft es nicht Woran liegt es?
Fehlermeldung für jede Datei:
viele Grüße
GSB
also EINZELN läuft alles vor echo und echo mit allem dahinter läuft auch einzeln,
aber so wie es da steht läuft es nicht Woran liegt es?
Fehlermeldung für jede Datei:
Code: Alles auswählen
./0download.sh: line 8: mv: command not found
./0download.sh: line 8: mv: command not found
./0download.sh: line 8: mv: command not found
./0download.sh: line 8: mv: command not found
./0download.sh: line 8: mv: command not found
./0download.sh: line 8: mv: command not found
GSB
Also bei mir funktioniert es problemlos. Komisch ist nur das der Fehler in Zeile 8 ist obwohl es nur 4 Zeilen Code sind.
Das Script das ich gepostet habe funktioniert eigenständig, du brauchst also nur noch das Script was ich gepostet habe, mehr nicht. Hast du das Ganze vielleicht noch irgendwie in ein anderes Script verwurstelt?
Hier nochmal mit escapten ". Probiers damit nochmal:
Das Script das ich gepostet habe funktioniert eigenständig, du brauchst also nur noch das Script was ich gepostet habe, mehr nicht. Hast du das Ganze vielleicht noch irgendwie in ein anderes Script verwurstelt?
Hier nochmal mit escapten ". Probiers damit nochmal:
Code: Alles auswählen
#!/bin/sh
for i in `ls $1/*`
do
`find $i -printf "mv --backup=t %p $2/%TY.%Tm.%Td-%TH.%TM.%TS.\`echo $i | cut -f2- -d\".\"\`"`
done
[ jabber ] chimerer@amessage.de
Hallo Chimerer!
Das Script funktioniert jetzt, sogar das vorherige was du geschrieben hast frag mich nicht wieso
Nun, das einzigste was bei deinem Script leider noch "falsch" läuft ist, dass wenn es zum Beispiel den Dateinamen 2003.12.21-13.15.05.jpg schon gibt, die Datei nach 2003.12.21-13.15.05.jpg.~1~ verschoben wird. Besser sollte die Endung auch dann noch beibehalten werden, also sollte es dann 2003.12.21-13.15.05.~1~.jpg heißen
Vielen Dank für die Hilfe!!
Gruß GSB
Das Script funktioniert jetzt, sogar das vorherige was du geschrieben hast frag mich nicht wieso
Nun, das einzigste was bei deinem Script leider noch "falsch" läuft ist, dass wenn es zum Beispiel den Dateinamen 2003.12.21-13.15.05.jpg schon gibt, die Datei nach 2003.12.21-13.15.05.jpg.~1~ verschoben wird. Besser sollte die Endung auch dann noch beibehalten werden, also sollte es dann 2003.12.21-13.15.05.~1~.jpg heißen
Vielen Dank für die Hilfe!!
Gruß GSB
- weedy
- Beiträge: 585
- Registriert: 02.11.2002 21:47:49
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Chimerer hat geschrieben:Code: Alles auswählen
#!/bin/sh [quote]Mit --backup=t wird keine Datei mit dem selben Namen überschrieben, sondern durchnummeriert: es wird ein .~1~ , .~2~ , .~3~ an den Dateinamen gehängt. [/quote] was das gleiche wie --backup=numbered ist. Funktioniert also doch, weedy. ;)[/quote] Ah, ja, das kann ich bestätigen, ich hatte bloß --backup eingegeben und mit --backup=numbered überschreibt er nichts. Bloß jetzt stellt sich die Frage, wie man an die se Information gelangt, in der Manpage war nichts zu finden. Da steht zwar --backup[=CONTROL] aber über CONTROL schweigt man sich darin aus. Ach doch, hier unten stehts. Wieso wird --backup verteilt kommentiert, das ist echt uncool. Also ich hätte schon von der Manpage erwartet, daß, wenn ein Parameter mit --backup[=CONTROL] beschrieben wird, ich mehr über 'CONTROL' finde, wenn ich nach diesem Wort suche. Nagut. Frustende. weedy.