Suffix umbenennen[gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
uwepr
Beiträge: 657
Registriert: 03.02.2007 12:13:01
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Halle/S.
Kontaktdaten:

Suffix umbenennen[gelöst]

Beitrag von uwepr » 24.06.2007 13:11:05

Liebe Debianer!
Meine Kodak-Kamera speichert Bilder als *.JPG.Da die Funktionalität mit dieser Dateiendung doch etwas eingeschränkt ist, verwendete ich bisher folgenden Einzeiler:

Code: Alles auswählen

for i in $(ls) ; do mv $i $(echo $i | tr '[:upper:]' '[:lower:]') 2>/dev/null  ; done
Nun möchte ich das Ganze in ein Script packen und die Funktionalität erweitern:

Code: Alles auswählen

#!/bin/bash
echo "wandle um" &&
for i in $(find *.JPG) ; do mv $i $(echo $i | tr '[:upper:]' '[:lower:]') 2>/dev/null  ; done &&
ls -lh &&
echo "erledigt"
Um das Script generell zum Umbenennen von Suffixen (z.B. für Dateien,die in Windows erstellt wurden) nutzen zu können,wäre es für mich wünschenswert,dass Großbuchstaben nur in Suffixen,aber nicht im gesamten Dateinamen in Kleinbuchstaben umgewandelt werden.Wie geht das?
Vielen Dank für Eure Hilfe im Vorraus!
Uwe Pr.
Zuletzt geändert von uwepr am 28.06.2007 15:03:27, insgesamt 5-mal geändert.
squeeze/fluxbox

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 24.06.2007 13:16:14

Ich benutze zum Anpassen der Dateiendung den Befehl rename. Schau dir mal die man-page dazu an.

Code: Alles auswählen

man rename
MfG GoKi
:wq

Benutzeravatar
Pendevil
Beiträge: 24
Registriert: 23.06.2007 21:55:02
Lizenz eigener Beiträge: GNU Free Documentation License

Beitrag von Pendevil » 24.06.2007 15:48:29

Hallo Uwe,

es gibt auch einen Befehl namens 'mmv' (Multiple Move). Der liegt allerdings, soweit ich weiss in einem separaten Paket. Ich denk mal, das heißt auch 'mmv'.
Mit diesem Kommandozeilen-Tool kann man auf elegante Weise solche Probleme wie deines lösen. Das ganze funktioniert mit Hilfe von "Wildcard patterns" (Plazhalter-Mustern):

Code: Alles auswählen

# Das Von-Muster und das Zu-Muster müssen "gequotet" (in Anführungsstrichen) sein!!! 
# "#1" trifft auf das erste (einzige) Von-Wildcard (*) zu
mmv "*.JPG" "#1.jpg"

Das sollte deine Dateien mit der Endung ".JPG" im aktuellen Verzeichnis mit der Endung ".jpg" versehen. Schau auch mal in die man-pages von 'mmv', die "Patterns" können komplexe Züge annehmen.

Gruß,
Daniel
Wenn Windows die Antwort ist, dann war's 'ne dumme Frage!

Benutzeravatar
uwepr
Beiträge: 657
Registriert: 03.02.2007 12:13:01
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Halle/S.
Kontaktdaten:

Beitrag von uwepr » 24.06.2007 16:45:04

Hallo,Ihr Zwei,
Danke für die schnellen Antworten,habe mmv installiert und schaue mir beides mal in Ruhe an. :D
Viele Grüße!Uwe Pr.
squeeze/fluxbox

Methusalix

Suffix umbenennen[gelöst]

Beitrag von Methusalix » 24.06.2007 18:32:27

Hallo,
es gibt natürlich auch eine Lösung mit sed:

Code: Alles auswählen

matthias@debbi:~/test$ ls
bla.JPG  fasel.JPG  suElZ.JPG
matthias@debbi:~/test$ ls | sed 's/\.JPG/\.jpg/'
bla.jpg
fasel.jpg
suElZ.jpg
Gruß
Matthias

Benutzeravatar
uwepr
Beiträge: 657
Registriert: 03.02.2007 12:13:01
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Halle/S.
Kontaktdaten:

Beitrag von uwepr » 25.06.2007 20:54:15

Hallo Matthias,
vielen Dank für Deine Antwort. Nachdem ich mich etwas mit rename und mmv beschäftigt hatte,wollte ich das [gelöst] schon wieder entfernen:
zu rename:

Code: Alles auswählen

RENAME(1)              Perl Programmers Reference Guide              RENAME(1)

NAME
       rename - renames multiple files
.........

  To translate uppercase names to lower, you’d use

               rename ’y/A-Z/a-z/’ *

uwe@debian-uwe:~$ cd ~/Pic
uwe@debian-uwe:~/Pic$  rename ’y/A-Z/a-z/’ *
Unrecognized character \xE2 at (eval 1) line 1.
uwe@debian-uwe:~/Pic$
8O

Ich müßte mich also auf die Suche nach einem korrekten perl-Argument machen.Von perl habe ich 0 Ahnung,wäre also eine gute Gelegenheit,etwas dazu zu lernen. ;-)
Wenn ich mmv in der for-Schleife statt mv benutze,ändert das nichts am Ergebnis,dass alle Großbuchstaben im Dateinamen umgewandelt werden,da sich an tr '[:upper:]' '[:lower:]',das die eigentliche Umwandlung ausführt,nichts ändert.
Der Streameditor ist die Lösung(edit:für mich][edit:Pustekuchen!!!sihe unten].
Da ich hier vor einem Familien-Rechner sitze,kommt es mir darauf an, das Script idiotensicher hinzukriegen.Die for-Schleife mit ls könnte gefährlich sein:Ich habe lieber nicht ausprobiert,was passiert,wenn cd vergessen wird und der Befehl in ~/ ausgeführt wird >>> ~/desktop statt ~/Desktop.Mit find .JPG war das schon viel besser.Dank Deiner Antwort nimmt mein suffixboy jetzt Gestalt an:jeweils eine Befehlszeile pro Dateityp.Was ich alles rein nehme,wird sich zeigen:für's erste .JPG,.PNG,.DOC und .XLS.
Danke!Sich verneig!
Uwe Pr.

Edit:@Pendevil:für mmv werde ich mir auch noch richtig Zeit nehmen,schätze,für mich gibt's da noch einiges zu lernen :o
Zuletzt geändert von uwepr am 26.06.2007 15:53:21, insgesamt 1-mal geändert.
squeeze/fluxbox

Benutzeravatar
uwepr
Beiträge: 657
Registriert: 03.02.2007 12:13:01
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Halle/S.
Kontaktdaten:

Beitrag von uwepr » 26.06.2007 12:47:31

Hallo,Ihr Lieben,
wollte Euch mal mitteilen,was aus meinem Vorhaben geworden ist:

Code: Alles auswählen

#!/bin/sh
#suffixboy
#wandelt die Dateiendung von ausgewählten Dateitypen
#von Groß- in Kleinbuchstaben um
#benötigt: mmv
#Benutzung:
# $ cd /Zielverzeichnis
# $ suffixboy

echo "wandle um" ;
mmv "*.JPG" "#1.jpg" ;
mmv "*.PNG" "#1.png" ;
mmv "*.DOC" "#1.doc" ;
mmv "*.XLS" "#1.xls" ;
echo "erledigt:" ;
ls -lh 
wirft aus:

Code: Alles auswählen

uwe@debian-uwe:~/Pic$ ~/suffixboy
wandle um
*.JPG -> #1.jpg : no match.
Nothing done.
*.PNG -> #1.png : no match.
Nothing done.
*.DOC -> #1.doc : no match.
Nothing done.
*.XLS -> #1.xls : no match.
Nothing done.
erledigt:
insgesamt 13M
-rw-r--r-- 1 uwe uwe 1,6M 2007-06-24 12:14 100_0550.jpg
-rw-r--r-- 1 uwe uwe 2,2M 2007-06-24 12:14 100_1864.jpg
-rw-r--r-- 1 uwe uwe 1,8M 2007-06-24 12:14 100_1908A.jpg
-rw-r--r-- 1 uwe uwe 6,8M 2007-06-24 12:23 Alpspitze.png
wenn alles schon umgewandelt/der Dateityp in dem Verzeichnis nicht enthalten ist.

Code: Alles auswählen

#!/bin/sh
#suffixgirl
#wandelt die Dateiendung von ausgewählten Dateitypen
#von Groß- in Kleinbuchstaben um
#Benutzung:
# $ cd /Zielverzeichnis
# $ suffixgirl

echo "wandle um" ;
ls | sed 's/\.JPG/\.jpg/' ;
ls | sed 's/\.PNG/\.png/' ;
ls | sed 's/\.DOC/\.doc/' ;
ls | sed 's/\.XLS/\.xls/' ;
echo "erledigt:" ;
ls -lh 

wirft entsprechend aus:

Code: Alles auswählen

uwe@debian-uwe:~/Pic$ ~/suffixgirl
wandle um
100_0550.jpg
100_1864.jpg
100_1908A.jpg
Alpspitze.png
100_0550.jpg
100_1864.jpg
100_1908A.jpg
Alpspitze.png
100_0550.jpg
100_1864.jpg
100_1908A.jpg
Alpspitze.png
100_0550.jpg
100_1864.jpg
100_1908A.jpg
Alpspitze.png
erledigt:
insgesamt 13M
-rw-r--r-- 1 uwe uwe 1,6M 2007-06-24 12:14 100_0550.jpg
-rw-r--r-- 1 uwe uwe 2,2M 2007-06-24 12:14 100_1864.jpg
-rw-r--r-- 1 uwe uwe 1,8M 2007-06-24 12:14 100_1908A.jpg
-rw-r--r-- 1 uwe uwe 6,8M 2007-06-24 12:23 Alpspitze.png
also keine direkte Fehlermeldung dabei,und mir deshalb lieber.Gibt es noch eine Möglichkeit,die Meldungen von mmv im ersten Beispiel zu unterdrücken?Habe schon mit find -f/--silent/--quiet experimentiert,aber logischerweise wirft find zumindest aus,dass nichts gefunden wurde,wenn keine *.JPG u.s.w. vorhanden sind.
Viele Grüße!Uwe Pr.
squeeze/fluxbox

Benutzeravatar
uwepr
Beiträge: 657
Registriert: 03.02.2007 12:13:01
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Halle/S.
Kontaktdaten:

Beitrag von uwepr » 26.06.2007 15:50:10

Puh:Überraschung,alles sah so schön aus:

Code: Alles auswählen

uwe@debian-uwe:~/Pic$ ls
100_0550.JPG  100_1864.JPG  100_1908A.JPG  Alpspitze.PNG  Performancetest
uwe@debian-uwe:~/Pic$ ls | sed 's/\.JPG/\.jpg/'
100_0550.jpg
100_1864.jpg
100_1908A.jpg
Alpspitze.PNG
Performancetest
uwe@debian-uwe:~/Pic$ ls
100_0550.JPG  100_1864.JPG  100_1908A.JPG  Alpspitze.PNG  Performancetest
uwe@debian-uwe:~/Pic$ ls | sed 's/JPG/jpg/'
100_0550.jpg
100_1864.jpg
100_1908A.jpg
Alpspitze.PNG
Performancetest
uwe@debian-uwe:~/Pic$ ls
100_0550.JPG  100_1864.JPG  100_1908A.JPG  Alpspitze.PNG  Performancetest
uwe@debian-uwe:~/Pic$
Hallo Matthias,was sagst Du dazu?Nachdem ich mich jetzt eine Stunde mit dem s-Befehl in sed beschäftigt habe,bin ich dahintergekommen,dass sed die durch ls gelieferten Textzeilen sehr wohl bearbeitet,aber deshalb noch lange nicht die Dateien umbenennt.Wenn ich den String JPG einfach durch jpg ersetzen lasse,kann ich mir auch den Backslash ersparen,es löst aber nicht meine Aufgabe.

@Pendevil:An mmv scheint doch kein Weg daran vorbeizuführen.Ich wollte lieber mit standardmäßig installierten Paketen auskommen,aber mmv ist so klein und dabei echt stark ;-) Irgendwie muß ich das geahnt haben:das script sollte von Anfang an suffixboy heißen und da habe ich erstmal mmv eingetragen.....Inzwischen habe ich auch mit über 200 Dateien in einem Rutsch getestet:trotz cd machen und suffixboy eintippen geht das immer noch schneller als mit thunar :D
Deshalb wäre ich jetzt an einer Unterdrückung der mmv-Meldungen noch mehr interessiert.Gibt es da noch einen Trick?
Viele Grüße!Uwe Pr.

edit:Nu hab ich's gepackt:

Code: Alles auswählen

uwe@debian-uwe:~$ cd ~/Pic
uwe@debian-uwe:~/Pic$ for i in $(ls) ; do mv $i $(echo $i | sed 's/\.JPG/\.jpg/') 2>/dev/null ; done
uwe@debian-uwe:~/Pic$ ls
100_0550.jpg  100_1864.jpg  100_1908A.jpg  Alpspitze.PNG  Performancetest
uwe@debian-uwe:~/Pic$ for i in $(ls) ; do mv $i $(echo $i | sed 's/\.JPG/\.jpg/') 2>/dev/null ; done
uwe@debian-uwe:~/Pic$
Keine Fehlermeldung und ich glaube auch idiotensicher.
Da hat sich's also doch noch gelohnt,sich mit sed auseinanderzusetzen.
Und so sieht meine Lösung nun aus (*.JPG,*.PNG u.s.w. werden standardmäßig 600 zugewiesen):

Code: Alles auswählen

#!/bin/bash
#suffixboy
#wandelt die Dateiendung von ausgewählten Dateitypen
#von Groß- in Kleinbuchstaben um
#Benutzung:
# $ cd /Zielverzeichnis
# $ suffixboy

echo "wandle um" ;
for i in $(ls) ; do mv $i $(echo $i | sed 's/\.JPG/\.jpg/') 2>/dev/null ; done ;
for i in $(ls) ; do mv $i $(echo $i | sed 's/\.PNG/\.png/') 2>/dev/null ; done ;
for i in $(ls) ; do mv $i $(echo $i | sed 's/\.DOC/\.doc/') 2>/dev/null ; done ;
for i in $(ls) ; do mv $i $(echo $i | sed 's/\.XLS/\.xls/') 2>/dev/null ; done ;
echo "setze Standard-Dateirechte" ;
chmod 644 *.jpg ;
chmod 644 *.png ;
chmod 644 *.doc ;
chmod 644 *.xls ;
echo "gibt's hier etwa keine jpg,png,doc oder xls?" ;
echo "Schau nach!" ;
ls -lh ;
echo "erledigt"
wirft aus:

Code: Alles auswählen

uwe@debian-uwe:~/Pic$ ~/suffixboy
wandle um
setze Standard-Dateirechte
chmod: Zugriff auf „*.doc“ nicht möglich: Datei oder Verzeichnis nicht gefunden
chmod: Zugriff auf „*.xls“ nicht möglich: Datei oder Verzeichnis nicht gefunden
gibt's hier etwa keine jpg,png,doc oder xls?
Schau nach!
insgesamt 13M
-rw-r--r-- 1 uwe uwe 1,6M 2007-06-24 12:14 100_0550.jpg
-rw-r--r-- 1 uwe uwe 2,2M 2007-06-24 12:14 100_1864.jpg
-rw-r--r-- 1 uwe uwe 1,8M 2007-06-24 12:14 100_1908A.jpg
-rw-r--r-- 1 uwe uwe 6,8M 2007-06-24 12:23 Alpspitze.png
drwxr-xr-x 2 uwe uwe 7,3K 2007-06-26 15:10 Performancetest
erledigt
uwe@debian-uwe:~/Pic$
:D :D :D :D :D
squeeze/fluxbox

Methusalix

Suffix umbenennen[gelöst]

Beitrag von Methusalix » 26.06.2007 23:36:29

Hallo,
Wenn ich den String JPG einfach durch jpg ersetzen lasse,kann ich mir auch den Backslash ersparen,es löst aber nicht meine Aufgabe.
Der backslash vor dem Punkt hat damit zu tun, das der Punkt bei sed eine Sonderbedeutung hat.
Deshalb ist der backslash in Deinem Beispiel weiter unten wohl auch wieder dabei... :wink:
Hallo Matthias...,bin ich dahintergekommen,dass sed die durch ls gelieferten Textzeilen sehr wohl bearbeitet,aber ... nicht die Dateien umbenennt.
Ich habe angenommen, das Du das bei Deiner Beschäftigung mit sed bemerkst - hast Du ja auch. :D
Falls Du Dich noch weiter mit dem Thema beschäftigen möchtest, hier ein link:
http://www.tty1.net/sed-tutorium/html/
Gruß
Matthias

Benutzeravatar
uwepr
Beiträge: 657
Registriert: 03.02.2007 12:13:01
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Halle/S.
Kontaktdaten:

Beitrag von uwepr » 27.06.2007 10:12:55

Hallo Matthias,
das ist lustig :lol: ,ich habe den Backslash gesetzt,weil ich davon ausging,dass der Punkt die Bedeutung wie auf der bash hat...
habe dann gleich mal

type sed

gemacht.
Danke für den Link auf das sed-tutorium.Das arbeite ich auf jeden Fall durch.
Bei'm Testen der Performance hat sich herausgestellt,dass

Code: Alles auswählen

#!/bin/sh
#JPGjpg
#wandelt die Dateiendung .JPG in .jpg um
#benötigt: mmv
#Benutzung:
# $ cd /Zielverzeichnis
# $ JPGjpg

echo "wandle um" ;
mmv "*.JPG" "#1.jpg" &&
echo "setze Standarddateirechte" &&
chmod 644 *.jpg &&
echo "zeige Verzeichnisinhalt an" &&
ls -lh ;
echo "erledigt"
ungefähr dreimal schneller läuft als das script mit der for-Schleife.Deshalb habe ich erstmal für die vier Dateitypen jeweils ein script mit mmv erstellt. Durch die Namensgebung ist das auch selbsterklärend und einfach zu merken.
Viele Grüße!Uwe Pr.

edit:Habe nun in der for-Schleife ls noch mit find *.JPG u.s.w.ersetzt und damit die Geschwindigkeit erheblich verbessern können.Ist auch logisch,da nun nur noch die Dateien mit mv und sed bearbeitet werden,die umbenannt werden sollen.Mit ls lief praktisch alles 4x durch.JPGjpg und Konsorten sind aber immer noch schneller.

edit2:Ich habe die Ausgabe noch etwas verschönt, indem ich statt nur ls -lh in den scripten mit

Code: Alles auswählen

ls -lh | gawk ' NR > 1 {print $8 "\t" "Größe:" "\t" $5}' ;
gawk die Ausgabe machen lasse.
edit3:endlich && kapiert :roll:
squeeze/fluxbox

Antworten