Shellscript: Dateiendung anhängen
-
Mit Unterverzeichnissen
#!/bin/bash for i in `find $1/* -type f`; do mv $i $i.$2 done;
Nenn es rename.sh. Und führ es mit
./rename.sh dasverzeichnis endung
aus.
-
Hey Danke, werds gleich mal Testen!
-
Sorry das Script gibt ne Fehlermeldung:
: bad interpreter: No such file or directory
-
Ok, hab nur die falschen Hochkommas verwendet.
Aber jetzt gibts nochn Problem
mailserver:/mnt # ./rename.sh test .xxx
mv: invalid option -- tHMM...
-
Lass den Punkt weg bei xxx.
-
OK habs langsam, ist schwierig die ganzen Sonderzeichen richtig abzutippen
-
Ok, hab jetzt den Punkt weggelassen, gibt aber immer noch die selbe Meldung
-
pasti schrieb:
Ok, hab jetzt den Punkt weggelassen, gibt aber immer noch die selbe Meldung
ersetze die mv $1 ... Sache mal durch
echo $i
was kommt da. Die Dateinamen? Ist test überhaupt ein Verzeichnis?
-
YUHU, jetzt gehts
Danke!!!
-
Ok hab das ganze gerade an den Orginaldaten ausprobiert. Das Problem ist jetzt nur, dass ganz vieeele Leerzeichen und Punkte in den Dateinamen sind . Die kanne das Script jetzt natürlich nicht verarbeiten. Gibts da irgend eine Lösung?
Danke
-
Versuch mal
mv "$i" "$i.$2"
-
Das hab ich schon, aber find hat das grössere Problem. Ich weiss nicht wellche Hochkommas ich wo hintunmuss, dasmit es die Ordner mit Leerzeichen auch nimmt.
Aber Danke für die Hilfe!
-
Und dann noch:
for i in "`find $1/* -type f`"; ...
Dann funktioniert es hoffentlich ...
Ansonsten poste mal die Ausgabe von
for i in "`find $1/* -type f`"; do echo "$i"; done
Edit: Hups, kleiner Fehler.
-
Deine Probleme liegen an dem "for i in `find`", find kann zB "eine Datei mit Leerzeichen" zurückgeben und dann weiß die Bash nicht dass das nur eine einzelne Datei ist. Das ist eben der Nachteil wenn Shells keine richtigen Arrays können...
-
Hat jemand vielleicht eine Idee oder weiss ein Tool wo Leerzeichen berücksichtigt werden. Zur Not auch für Windows
-
Hallo,
wieso denn für Windows ?
Unter GNU /Linux sollte es mit der bash, find und xargs folgendermaßen funktionieren:find "$1/*" -type f -print0 -exec xargs -0 mv '{}' \{\}.$2 \;
Dadurch werden die Dateinamen mit Nullzeichen (ASCII-Code 0) getrennt, es gibt also kein Problem mit Leerzeichen mehr. Die {} müssen mit '' oder \ vor der Shell geschützt werden (werden von find durch die gefundenen Dateinamen ersetzt).
Mit freundlichen Grüßen
Linuxfreak
-
Poste doch bitte nochmal Dein Testprogramm und die Fehlermeldungen, grundsätzlich ist der Ansatz doch nicht soo schlecht...
edit: Hm, nur 5 Minuten zu spät...
-
@Linuxfreak,
Habe gerade deine Lösung getestet. Find sagt mir, dass das angegebene Verzeichniss nicht existiert.
-
Hast du meinen 2. Vorschlag [s.o.] schon getestet? Und wie hast du Linuxfreaks Version aufgerufen?
-
Deine Lösung (
#!/bin/bash
for i in "`find 1/* -type f\`"; do echo "i"; done)
funktioniert zwar, es werden alle Dateien aufgelistet,
aber bei (
#!/bin/bash
for i in "`find 1/* -type f\`"; do mv "i" "$i.tif"; done)
werden alle Dateinamen aneinandergefügt und mv meldet: File name too long
Die Lösung von Linuxfreak hab ich in eine Datei geschrieben:
#!/bin/bash
find "$1/*" -type f -print0 -exec xargs -0 mv '{}' \{\}.$2 \;und mit ./rename.sh verzeichnis endung ausgeführt
Es heisst dann: find: verzeichnis/*: No such file or directory
Ich glaub ich bring ein Buch raus: "Jetzt lerne ich Shellscript in 21 Posts"