Hallo zusammen, warum funktioniert folgendes nicht: find ~ -iname ... -exec cp {} $(echo {} | tr ...) \; Ich frage mich hier, warum der letzte Teil nicht funktioniert. echo {} gibt zwar den gefundenen Dateinamen aus. Und das passiert, soweit ich sehen kann, auf stdout und nicht auf stderr. Trotzdem ersetzt tr nicht wie gewünscht, sodaß ich annehme, daß echo {} | tr nicht das stdout von echo auf stdin von tr leitet. Warum nicht? Was mache ich falsch? -- 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 Tuesday 22 December 2009 08:54:41 Andre Tann wrote:
find ~ -iname ... -exec cp {} $(echo {} | tr ...) \; ... Warum nicht? Was mache ich falsch?
Hat mich auch schon "genervt". Aber so geht es zumindest mal: find ~ -iname ... -exec bash -c 'cp {} $(echo {} | tr ...)' \; Vielleicht geht's ja auch noch besser? Roman -- Roman Fietze Telemotive AG Büro Mühlhausen Breitwiesen 73347 Mühlhausen Tel.: +49(0)7335/18493-45 http://www.telemotive.de -- 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 Andre! On Di, 22 Dez 2009, Andre Tann wrote:
Hallo zusammen,
warum funktioniert folgendes nicht:
find ~ -iname ... -exec cp {} $(echo {} | tr ...) \;
Ich frage mich hier, warum der letzte Teil nicht funktioniert. echo {} gibt zwar den gefundenen Dateinamen aus. Und das passiert, soweit ich sehen kann, auf stdout und nicht auf stderr. Trotzdem ersetzt tr nicht wie gewünscht, sodaß ich annehme, daß echo {} | tr nicht das stdout von echo auf stdin von tr leitet.
Doch doch, das macht er schon, nur nicht so, wie Du denkst: #v+ chrisbra t41:/tmp/cleanse [1131]% set -x +-zsh:134> set -x chrisbra t41:/tmp/cleanse [1132]% find . -type f -exec cp '{}' "$(echo '{}' | tr ' ' '_')" \; +-zsh:135> echo '{}' +-zsh:135> tr ' ' _ +-zsh:135> find . -type f -exec cp '{}' '{}' ';' #v- Das heißt, Process Substitution findet schon statt. Nur viel zu früh. die Shell macht nämlich aus dem Literal {} wieder eine {}, weil darin kein Leerzeichen enthalten ist. Und dann erst startet find und führt für jede Datei -exec cp '{}' '{}' aus. Ich würde das dann so lösen, dass ich gleich die Shell als auszuführendes Programm angebe. Da ist man dann viel flexibler. #v+ chrisbra t41:/tmp/cleanse [1148]% find . -type f -exec bash -c 'set -x; cp "$1" "${1// /_}"' find-sh '{}' \; +-zsh:151> find . -type f -exec bash -c 'set -x; cp "$1" "${1// /_}"' find-sh '{}' ';' + cp './~ ' ./~_ + cp './ ~' ./_~ + cp './ ä+?\\ ' './_ä+?\\_' + cp './ä? ?' './ä?_?' #v- das set -x dient hier nur zur Verdeutlichung. Das kannst Du natürlich weg lassen. regards, Christian -- :wq -- 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 (3)
-
Andre Tann
-
Christian Brabandt
-
Roman Fietze