Shellscript: Dateiendung anhängen
-
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"
-
Hab noch das gefunden:
find "dir" -type f -print | while read f; do n="\`dirname \\"f\"`/`basename \"f\\" | sed 's/ /_/g'\`" if test -e "n"; then
echo "Ziel \"n\\" existiert" >&2 else mv "f" "$n"
fi
doneSagt mir aber dann: find: invalid predicate `'
PS: Geklaut von: http://www.jan-trippler.de/quickies/files.html
-
pasti schrieb:
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
Das kann man wirklich als Buch rausbringen. Köstlich
Die Leerzeichen kann man ja auch ersetzen, jetzt wird's lustig:#!/bin/bash for i in `find $1/* -type f`; do realname=`echo $i | sed "s/ /\\ /"` mv $realname $realname.$2 done;
Ungeprüft, kann das mal jemand vereinfachen!
Evtl. mit Xargs
-
ºgrimmsenº schrieb:
#!/bin/bash for i in `find $1/* -type f`; do
Peng, genau hier liegt der Fehler.
Stell Dir mal vor $1 ist foo und in foo liegt eine Datei namens "baz bar" (mit Leerzeichen).
Was wird dann die Bash wohl (in Ermangelung eines echten Array-Typs) machen?
Genau! foo/baz und bar getrennt bearbeiten.
-
So, einmal will ich aber auch noch
#!/bin/bash
find "$1"/* -type f -exec mv '{}' \{\}.$2 \;
-
Logisch... Denkfehler meinerseits
Wie wäre das:#!/bin/bash for i in `find $1/* -type f | sed "s/ /\\/g"`; do realname=`echo $i | sed "s/\\/\\ /g"` mv $realname $realname.$2 done;
Mmmh... müßte funzen, oder pasti
-
Und nachdem ich mir das ganze hier nicht länger ansehen kann:
Probier mal sowas:#!/bin/bash find "$1" -type f -exec mv '{}' \{\}.$2 \;
-
ºgrimmsenº schrieb:
Wie wäre das:
#!/bin/bash for i in `find $1/* -type f | sed "s/ /\\/g"`; do
Schlecht, probiers aus.
-
Hab mich ja schon entschuldigt...
-
ºgrimmsenº schrieb:
Hab mich ja schon entschuldigt...
Wofür denn, ich hab Dich ja eh ausgebessert.
-
Ich liebe for-Schleifen ... Aber wer benutzt eigentlich Leerzeichen bei Dateinamen? Ihhh...
In der Shell leidet dann immer mein tab-Taste...[geschlossen]