Datei-Eigenschaften auslesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
GSB
Beiträge: 25
Registriert: 11.09.2003 08:43:34
Wohnort: Schlumpfhausen
Kontaktdaten:

Datei-Eigenschaften auslesen

Beitrag von GSB » 17.12.2003 01:12:02

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

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 17.12.2003 08:24:15

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 :-)
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

fluid
Beiträge: 494
Registriert: 14.11.2003 21:52:49

Beitrag von fluid » 17.12.2003 11:46:49

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.
Jo, das sollte bei einem FAT32 kein Problem sein. Mehr als 8 Zeichen sind sowieso erlaubt und AFAIK auch mehrere Punkte.

Benutzeravatar
dmeister
Beiträge: 258
Registriert: 05.07.2002 08:01:53
Wohnort: Zürich
Kontaktdaten:

Beitrag von dmeister » 17.12.2003 15:59:46

Hallo, hab da mal schnell was zusammengefrickelt:

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
Das Script kannst du nun zum Beispiel rename.sh nennen und dann mit

Code: Alles auswählen

 ./rename.sh *.jpg
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 :lol:
Jabber: neptoon@jabber.org
It's only Rock'n'Roll but I like it

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 17.12.2003 17:29:30

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"`

Benutzeravatar
dmeister
Beiträge: 258
Registriert: 05.07.2002 08:01:53
Wohnort: Zürich
Kontaktdaten:

Beitrag von dmeister » 17.12.2003 17:35:22

Ist natürlich auch eine Möglichkeit . Gefällt mir auch :wink:
Jabber: neptoon@jabber.org
It's only Rock'n'Roll but I like it

init 0
Beiträge: 673
Registriert: 21.10.2003 19:40:28

Beitrag von init 0 » 17.12.2003 17:38:30

Hi,

zu deinem ls Problem kann ich dir folgendes sagen:

Code: Alles auswählen

ls -l file1.jpg | awk '{print $6"."$7}'| sed -e "s/:/./"
Aber es gibt sicherlich bessere Lösungsansätze.

Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Beitrag von weedy » 18.12.2003 00:01:04

Es gäbe dann noch die Variante:

Code: Alles auswählen

ls *.jpg| xargs -n1 -i date -r {} +"%Y.%m.%d-%H.%M.%S.jpg"
weedy

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 18.12.2003 09:12:59

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

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 18.12.2003 11:15:01

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..
Für solche Fälle gibt es bei mv den backup Parameter ;):

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 

Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Beitrag von weedy » 18.12.2003 15:25:53

Chimerer hat geschrieben:
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..
Für solche Fälle gibt es bei mv den backup Parameter ;):
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:

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

Die erste Spalte ist eine Fortlaufende Nummer und kann dann per awk mit an den Filenamen gepappt werden.

weedy.

Benutzeravatar
GSB
Beiträge: 25
Registriert: 11.09.2003 08:43:34
Wohnort: Schlumpfhausen
Kontaktdaten:

Beitrag von GSB » 20.12.2003 04:44:39

Hallo!

Erstmal dickes Lob und vielen Dank für die Hilfe! Ihr habt ja genau das Problem gelöst das ich angegeben hatte. :D

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/
move.sh :

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
ext.sh :

Code: Alles auswählen

#!/bin/bash
for i
  do
    `find $i -printf "mv %p %p.jpg"`
done
( 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.

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 20.12.2003 12:27:20

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 
 
So, alles in einem Script. Dateiendung wird erhalten. Nur die find-Zeile mit dem printf stört mich, sollte mit exec bestimmt eleganter zu lösen sein.

Code: Alles auswählen

./script.sh verzeichnis-mit-bildern/ zielverzeichnis/
Mit --backup=t wird keine Datei mit dem selben Namen überschrieben, sondern durchnummeriert: es wird ein .~1~ , .~2~ , .~3~ an den Dateinamen gehängt.
was das gleiche wie --backup=numbered ist. Funktioniert also doch, weedy. ;)

Benutzeravatar
GSB
Beiträge: 25
Registriert: 11.09.2003 08:43:34
Wohnort: Schlumpfhausen
Kontaktdaten:

Beitrag von GSB » 21.12.2003 18:59:55

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:

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
viele Grüße
GSB

Chimerer
Beiträge: 514
Registriert: 28.01.2002 16:10:44

Beitrag von Chimerer » 21.12.2003 21:19:54

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:

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 

Benutzeravatar
GSB
Beiträge: 25
Registriert: 11.09.2003 08:43:34
Wohnort: Schlumpfhausen
Kontaktdaten:

Beitrag von GSB » 23.12.2003 15:02:50

Hallo Chimerer!

Das Script funktioniert jetzt, sogar das vorherige was du geschrieben hast :D frag mich nicht wieso :wink:

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 :roll:

Vielen Dank für die Hilfe!! :D
Gruß GSB

Benutzeravatar
weedy
Beiträge: 585
Registriert: 02.11.2002 21:47:49
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Beitrag von weedy » 28.12.2003 21:27:57

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.

Antworten