Frage zu find und sed und Quoten
Hallo zusammen, ich möchte alle Dateien suchen, die ein & im Namen haben, und dieses durch _ ersetzen. Warum funktioniert das hier nicht: find . -iname '*&*' | while read xx; do mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done Es kommt immer die Fehlermeldung, daß die gesuchte Datei nicht gefunden werden konnte, wobei der aufgeführte Name ein & enthält. Dabei ist der Name aber korrekt von " umschlossen worden, was ich auf diese Weise sehe: find . -iname '*&*' | while read xx; do echo mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done Woran fehlt es? -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag, 28. April 2008 12:01:09 schrieb Andre Tann:
Hallo zusammen,
ich möchte alle Dateien suchen, die ein & im Namen haben, und dieses durch _ ersetzen. Warum funktioniert das hier nicht:
find . -iname '*&*' | while read xx; do mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
warum wird mv "\"$xx\"" und nicht einfach mv "$xx" geschreiben? Sei x=abc mv "\"$xx\"" sagt doch, daß der Dateiname "abc" bewegt werden soll (also incl. der ")
Es kommt immer die Fehlermeldung, daß die gesuchte Datei nicht gefunden werden konnte, wobei der aufgeführte Name ein & enthält. Dabei ist der Name aber korrekt von " umschlossen worden, was ich auf diese Weise sehe:
find . -iname '*&*' | while read xx; do echo mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
Woran fehlt es?
Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
On 28.04.2008 12:08, Dr. Jürgen Vollmer wrote (please find the answer below the original text):
warum wird mv "\"$xx\"" und nicht einfach mv "$xx" geschreiben?
Sei x=abc mv "\"$xx\"" sagt doch, daß der Dateiname "abc" bewegt werden soll (also incl. der ")
Bye Jürgen
Nicht ganz richtig. Nachdenken! Es können auch Leerzeichen im Dateinamen stecken. Die würden sofort die Dateinamen in der Liste verreißen und dann die while-Schleife mit Fehlermeldungen stören! Deshalb werden -völlig richtig- die einzelnen Dateinamen in der Liste mit "" umschlossen. -Ingo. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On 28.04.2008 12:08, Dr. Jürgen Vollmer wrote (please find the answer below
Am Montag, 28. April 2008 12:20:01 schrieb Ingo Freund: the original text):
warum wird mv "\"$xx\"" und nicht einfach mv "$xx" geschreiben?
Sei x=abc mv "\"$xx\"" sagt doch, daß der Dateiname "abc" bewegt werden soll (also incl. der ")
Bye Jürgen
Nicht ganz richtig. Nachdenken! Es können auch Leerzeichen im Dateinamen stecken. Die würden sofort die Dateinamen in der Liste verreißen und dann die while-Schleife mit Fehlermeldungen stören!
ok, deshalb ja auch einmal " um das Argument $xx aber warum "\" das verstehe ich nicht,. touch abc; mv "abc" xyz ist ok, aber touch abc; mv "\"abc\"" xyz liefert: mv: Aufruf von stat für »"abc"« nicht möglich: Datei oder Verzeichnis nicht gefunden Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dr. Jürgen Vollmer, Montag, 28. April 2008 12:08:
warum wird mv "\"$xx\"" und nicht einfach mv "$xx" geschreiben?
Das hab ich nur deswegen probiert, weil es auch mit mv "$xx" nicht geklappt hat. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Andre, On Monday 28 April 2008 12:01:09 Andre Tann wrote:
find . -iname '*&*' | while read xx; do mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
Ich nutze bei der bash lieber $(prog) anstatt die Backticks: find . -iname '*&*' | \ while read xx; do mv "$xx" $(echo $xx | sed 's/&/_/g'); done Und das scheint zu funktionieren. Quoting um $() herum ist IMHO nicht notwendig. Roman -- Roman Fietze Telemotive AG Büro Mühlhausen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 28 Apr 2008, Roman Fietze schrieb:
On Monday 28 April 2008 12:01:09 Andre Tann wrote:
find . -iname '*&*' | while read xx; do mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
Ich nutze bei der bash lieber $(prog) anstatt die Backticks:
find . -iname '*&*' | \ while read xx; do mv "$xx" $(echo $xx | sed 's/&/_/g'); done
Und das scheint zu funktionieren. Quoting um $() herum ist IMHO nicht notwendig.
Der Anschein ist nicht ausreichend. -dnh -- "You don't have to spamvertise good porn." -- Bisky, in a conversation -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On 28.04.2008 12:01, Andre Tann wrote (please find the answer below the original text):
Hallo zusammen,
ich möchte alle Dateien suchen, die ein & im Namen haben, und dieses durch _ ersetzen. Warum funktioniert das hier nicht:
find . -iname '*&*' | while read xx; do mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
Es kommt immer die Fehlermeldung, daß die gesuchte Datei nicht gefunden werden konnte, wobei der aufgeführte Name ein & enthält. Dabei ist der Name aber korrekt von " umschlossen worden, was ich auf diese Weise sehe:
find . -iname '*&*' | while read xx; do echo mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
Woran fehlt es?
Man kann mit "set -x" vorher viel debug anschalten. und mit "set +x" debug danach wieder ausmachen. Hilft manchmal viel. -Ingo. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On 28.04.2008 12:01, Andre Tann wrote (please find the answer below the original text):
Hallo zusammen,
ich möchte alle Dateien suchen, die ein & im Namen haben, und dieses durch _ ersetzen. Warum funktioniert das hier nicht:
find . -iname '*&*' | while read xx; do mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
Es kommt immer die Fehlermeldung, daß die gesuchte Datei nicht gefunden werden konnte, wobei der aufgeführte Name ein & enthält. Dabei ist der Name aber korrekt von " umschlossen worden, was ich auf diese Weise sehe:
find . -iname '*&*' | while read xx; do echo mv "\"$xx\"" "'$(echo $xx | sed 's/&/_/g')'"; done
Woran fehlt es?
Experiment auf Basis des find outputs: find . -name 'a*' ./abc ./ab c ./a&bc set -x; find . -name '*&*' | while read xx; do mv "$xx" "'$(echo $xx |sed 's/\&/_/g')'"; done; set +x + find . -name '*&*' + read xx ++ echo './a&bc' ++ sed 's/&/_/g' + mv './a&bc' ''\''./a_bc'\''' mv: cannot move `./a&bc' to `\'./a_bc\'': No such file or directory + read xx + set +x set -x; find . -name '*&*' | while read xx; do mv "$xx" "$(echo $xx |sed 's/\&/_/g')"; done; set +x + find . -name '*&*' + read xx ++ echo './a&bc' ++ sed 's/&/_/g' + mv './a&bc' ./a_bc + read xx + set +x Roman hat Recht: es sind also die ' um den zweiten mv Operanden zu viel! Allerdings heißen diese hier ` Backticks. Er meint wohl eher die Ticks, also diese ' . -Ingo. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 28 Apr 2008, Andre Tann schrieb:
ich möchte alle Dateien suchen, die ein & im Namen haben, und dieses durch _ ersetzen. Warum funktioniert das hier nicht:
find . -iname '*&*' | while read xx; do mv "\"$xx\"" "'$(echo $xx | ^^ ^^ ^ sed 's/&/_/g')'"; done ^ Was sollen diese Anführungszeichen?
[..]
Woran fehlt es?
An der systematischen Herangehensweise was das Quoten angeht. find . -iname '*&*' | while read -r xx; do \ mv -i "$xx" "$(echo "$xx" | sed 's/&/_/g')" done oder: find . -iname '*&*' | while read -r xx; do \ mv -i "$xx" "$(echo "$xx" | tr '&' '_')" done oder: find . -iname '*&*' | while read -r xx; do \ mv -i "$xx" "`echo \"$xx\" | tr '&' '_'`" done Das 'mv -i' falls der neue Dateiname bereits existiert. Man beachte den Unterschied zwischen `` und $(). Innerhalb von `` müssen die inneren "" escped werden, innerhalb von $() nicht. Und wieder, wie schon von anderen angemerkt: set -x hilft dabei, solche Probleme zu erkennen. -dnh -- Er will sie nicht? Er, will sie nicht? Er will, sie nicht? Er will sie, nicht? -- Sascha Broich -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi David! On Mon, 28 Apr 2008, David Haller wrote:
find . -iname '*&*' | while read -r xx; do \ mv -i "$xx" "$(echo "$xx" | sed 's/&/_/g')" done
oder:
find . -iname '*&*' | while read -r xx; do \ mv -i "$xx" "$(echo "$xx" | tr '&' '_')" done
oder:
find . -iname '*&*' | while read -r xx; do \ mv -i "$xx" "`echo \"$xx\" | tr '&' '_'`" done
Spontan hätte ich ja gesagt (für bash): find . -name '*&*'| while read -r xx; do mv -i "$xx" "${xx/&/_)"; done Und wieso eigentlich -iname? Mit freundlichen Grüßen Christian -- hundred-and-one symptoms of being an internet addict: 134. You consider bandwidth to be more important than carats. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 28 Apr 2008, Christian Brabandt schrieb:
Spontan hätte ich ja gesagt (für bash): find . -name '*&*'| while read -r xx; do mv -i "$xx" "${xx/&/_)"; done
$ t='a&b&c'; echo "${t/&/_}" a_b&c Nicht ganz das gewollte... Man könnte aber ne Schleife drumbasteln: find . -name '*&*' | while read -r new; do \ while test "x${new/&/_}" != "x${new}"; do \ new="${new/&/_}"; \ done; \ mv -i "$xx" "$new"; \ done
Und wieso eigentlich -iname?
Ja, ist hier überflüssig. -dnh -- *pieps* Die Verkehrshinweise: Im Netzwerkkabel von Marc 100 MB Stau wegen einer Vollsperrung der Ausfahrt Festplatte. Bitte warten Sie auf dem Rasthof FTP-Server. *pieps* -- C. Boltz -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi David! On Mon, 28 Apr 2008, David Haller wrote:
Hallo,
Am Mon, 28 Apr 2008, Christian Brabandt schrieb:
Spontan hätte ich ja gesagt (für bash): find . -name '*&*'| while read -r xx; do mv -i "$xx" "${xx/&/_)"; done
$ t='a&b&c'; echo "${t/&/_}" a_b&c
*grummel* $ t='a&b&c'; echo "${t//&/_}" a_b_c
find . -name '*&*' | while read -r new; do \ while test "x${new/&/_}" != "x${new}"; do \ new="${new/&/_}"; \ done; \ mv -i "$xx" "$new"; \ done
eigentlich unnötig. Mit freundlichen Grüßen Christian -- Jedes Problem erlaubt zwei Standpunkte: Unseren eigenen und den falschen. -- Channing Pollock -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (6)
-
Andre Tann
-
Christian Brabandt
-
David Haller
-
Dr. Jürgen Vollmer
-
Ingo Freund
-
Roman Fietze