Die Namen mehrerer Dateien durchnummerieren und das Erstellungsdatum ändern.

FalseCAM

FalseCAM

Tripel-As
Hallo
Also um die Durchnummerierung geht es mir nur nebenbei, aber das Erstellungsdatum zu ändern ist mir schon wichtig.
Folgendes: Ich möchte meine selbst geschossenen Bilder mit einem schönen Programm Verwalten. Dieses hat eine schöne Timeline, auf der man die Bilder finden kann. Das Problem: Alle Bilder sind im Jahre 2044 eingeordnet, weil ich das Datum nie in der Kamera einstelle.
Jetzt hätte ich gern ein Programm, welches mir allen Dateien in einem bestimmten Verzeichnis ein von mir festgelegtes Datum übergibt.
Da ich aber mal annehme, dass es unter Linux kein solches Programm, wegen Unnötigkeit durch die shell, gibt, hoffe ich, dass jemand ein shell-script hat oder weiss, wie man soetwas realisiert.
Zum Durchnummerieren, wird jemandem wohl etwas leichtes einfallen.
Ich hoffe auf und danke euch für eure Hilfe.
 
macht 'touch -d...' oder 'touch -t...' das, was Du suchst?
 
@slasher @rikola, ich denke es ist schon das richtige, wenn ich damit das Erstellungsdatum ändern kann.
Wie kann ich es aber in einem shellscript verwenden, dass ich am anfang nach einem Datum gefragt werde und mir das Script dann die Daten aller Dateien im aktuellen Ordner ändert?
 
FalseCAM schrieb:
Zum Durchnummerieren, wird jemandem wohl etwas leichtes einfallen.
Ich hoffe auf und danke euch für eure Hilfe.

Ich hoffe mal, dass derjenige dem etwas einfällt du bist. ;)
Wir sind eigentlich keine Scriptfabrik.
touch wurde schon genannt, zum Numerieren solltest du dir mal mv ansehen, und das in eine Schleife über genannte Dateien einbauen.
Um über einen Zähler zu iterieren, kannst du schematisch so vorgehen:
Code:
...
A=0; #Initialisieren am Anfang WICHTIG!
for F in foo*;do
A=$((A+1));# Hochzählen
mv $F ${F}_$A 
done ...

Natürlich musst du für den Schleifenkörper noch die Bedingung etwa mit find o.Ä. anpassen, und prüfen ob es die Datei schon gibt, und ob die Berechtigung da ist etc.

Gruß Wolfgang
 
FalseCAM schrieb:
@slasher @rikola, ich denke es ist schon das richtige, wenn ich damit das Erstellungsdatum ändern kann.
Wie kann ich es aber in einem shellscript verwenden, dass ich am anfang nach einem Datum gefragt werde und mir das Script dann die Daten aller Dateien im aktuellen Ordner ändert?

Wenn es nur um den aktuellen Ordner geht:
Code:
find . -type f -maxdepth 1 -name "foo*" -printf "%f\n"|cat -n |while read NR NAME; do touch $NAME&&echo "mv $NAME ${NR}_$NAME" ;done

Nun noch echo entfernen wenn es klappt und dein gewünschtes Datum bei touch einfügen...

Gruß Wolfgang
PS Ach ja, wenn du mit unmöglichen Zeichen in dateinamen arbeitest, solltest du noch -print0 nebst xargs verwenden.
 
Hier mal ein modifiziertes Zwischenergebnis:
Code:
#Created by Wolfgang, modified by FalseCAM

IFS="\n"
A=0; #Initialisieren am Anfang WICHTIG!
for File in *.jpg;do
A=$((A+1));# Hochzählen
ziel=`echo $A'.jpg'`
mv $File $ziel 
done

Edit: Ich glaube mit touch kann man gar nicht das Erstellungsdatum ändern :/
 
Zuletzt bearbeitet:
Hallo
Damit gibst du deinen dateien aber nur noch Nummern.

Statt ziel =`echo...`
Kannst du auch gleich
ziel="${A}.jpg" schreiben, das spart einen unnötigen Prozess.
du kannst das sogar gleich in deinen mv-Befehl verwenden.

Tipp: Gibt $ziel und $FILE vorher mit echo aus, um zu prüfen, ob das rauskommt was du willst.
Erst dann mach mv scharf.
Vor dem Verschieben füge einfach den touch auf $FILE aus und du hast was du willst.
Ist natürlich ein dirty Hack, weil du nicht prüfst, ob die Datei schreibbar ist.
Wenn irgendwelche Leerstellen in deinen Dateinamen vorkommen, kann es zu unerwarteten Ergebnissen kommen.
Die Dateinamen-Expansion "*.jpg" der shell interessiert sich nämlich nicht um dein IFS, was sogesehen hier wirkungslos bleibt.

Gruß Wolfgang
 
Danke @Wolfgang, du hast mir bisher sehr geholfen.
Nun sieht das bei mir so aus:
Code:
#Created by Wolfgang, modified by FalseCAM
echo "Alle Dateien in diesem Ordner welches Erstellungsdatum übergeben?"
echo "Format: YYYYMMDDhhmm"
read datum

IFS="\n"
A=0; #Initialisieren am Anfang WICHTIG!
for File in *.jpg;do
A=$((A+1));# Hochzählen
touch -t $datum $File
ziel=`echo $A'.jpg'`
mv $File $ziel
done
Das Problem ist nur, dass touch -t nur das Modified Date ändert :( , nicht aber das Creation Date. :( :(
 
Zuletzt bearbeitet:
FalseCAM schrieb:
Edit: Ich glaube mit touch kann man gar nicht das Erstellungsdatum ändern :/

Dann bist du scheinbar ungläubig. :D
Was sagt denn dein: man touch?
$ ls -l test
-rw-r--r-- 1 wolle wolle 492 2006-05-27 18:00 test
$ touch -d"19700101" test
$ ls -l test
-rw-r--r-- 1 wolle wolle 492 1970-01-01 00:00 test

Gruß Wolfgang
 
Ich habe es nochmal mit touch -d ausprobiert. Auch das ändert nur das Modified Date.
 
Hallo
Was willst du denn ändern?
Lies bitte mal die Manpage!
touch -d"20060213" --time=atime test

Nur mal so als Denkanstoß.

Gruß Wolfgang
 
Hier ist das, was ich ändern möchte:
 

Anhänge

  • snapshot1.png
    snapshot1.png
    133,3 KB · Aufrufe: 11
Ich glaube, man kann die creation time des inodes (nicht verwechseln mit der ctime - change time) nicht mittels touch ändern. Das geht wohl nur, wenn Du die Datei umkopierst. Also date setzen, kopieren (ohne preserve-timestamp).

Aber: die creation time des Bildes sollte dem Datum entsprechen, an dem Du die Bilder von der Kamera auf Deinen Rechner kopiert hast. Deswegen vermute ich, dass die Creation time nicht die des inodes ist, sondern die in den exif-Daten des Bildes gespeicherte ist. Wie man die ändert -> keine Ahnung.

Gruss, Xanti
 
Zuletzt bearbeitet:
Aaaahhh exif-Daten. So nennt man das. Das wusste ich bis dato noch nicht.
Abe rich denke doch mal, dass man das auch irgendwie Änndern könnte, odeR? Bei OGG/MP3 gibts ja diese Tags - im übertragenden Sinne kann man das ja mit den exif-Daten vergleichen Also müsste es doch auch hier ne Chance zur Änderung geben.
 
Für Perl gibts exif-Module. Vielleicht gibts auch etwas aus der ImageMagick-Suite.

Gruss, Xanti
 
Ich hab jetzt die "exiftool"s gefunden und auch schon mit Smart installiert. Bin nur noch dabei mir die ganzen manpages durchzulesen.
 
Hallo
Das ist ja aber nun etwas ganz anderes, als du hier angegeben hast.
Diese Daten stehen ja dann in der Datei, und haben nix mit den Dateiattributen zu tun.

Gruß Wolfgang
 
@Wolfgang, ich entschuldige mich dafür, aber ich hatte das auch nicht gewusst.

Hier ist nun ein Fertiges Script:
Code:
#Created by Wolfgang, modified by FalseCAM
IFS="\n"
echo "Alle Dateien in diesem Ordner welches Erstellungsdatum übergeben?"
echo "Format: YY:MM:DD"
read CreationDate
A=0; #Initialisieren am Anfang WICHTIG!
for File in *.jpg;do
A=$((A+1));# Hochzählen
CreationTime='00:00:00'
exiftool -CreateDate="$CreationDate $CreationTime" -DateTimeOriginal="$CreationDate $CreationTime" -ModifyDate="$CreationDate $CreationTime" $File
if [ $A -lt 10 ]
		then ziel='0000'$A'.jpg'
	elif [ $A -lt 100 ]
		then ziel='000'$A'.jpg'
	elif [ $A -lt 1000 ]
		then ziel='00'$A'.jpg'
	elif [ $A -lt 10000 ]
		then ziel='0'$A'.jpg'
	else	ziel=$A'.jpg'
fi
mv $File $ziel
done
Das Programm exiftool findet man im Internet oder mit Smart :)

Edit: Ich habe das Script nochmal in Hinsicht auf die Namensgebung geändert.
 
Zuletzt bearbeitet:
Hallo @FalseCAM

Na wenn es jetzt tut, was du willst, ist es ja ok.
Aber wirf mal die sinnlose Zeile
IFS="\n" raus.
Und ändere die Zeile
ziel=`echo $A'.jpg'`
in
ziel=${A}.jpg
um.

Btw gibt es dafür das Perlmodul Image::ExifTool.
Was für ein System benutzt du eigentlich?
Ich installier mir sowas mit apt-get. ;)
Als nützliche Lehre kannst du daraus mitnehmen, das Ziel vorher genau zu definieren (zu analysieren), um dann nach den Mitteln das zu erzielen zu suchen.


Gruß Wolfgang
 

Ähnliche Themen

Heimserver Konfiguration für Ubuntu Server?!

Erzeugen eines HTML-File zur Verwaltung einer Liste von Bild-Dateien

scrollrad scrollt nur horizontal -.-

Mal komplett was neues aufbauen ?

was soll das?

Zurück
Oben