Hi,
ich hab kein Problem, mich interessiert nur genau warum folg. klappt (ich will Dateien mit einem Leerzeichen umbenennen ' ' -> '_')
echo test datei `echo test datei|sed s/\ /_/g`
test datei test_datei
aber dies klappt nicht:
find . -type f -name "*\ *" -exec echo {} `echo "{}"|sed s/\ /_/g` ;
./test datei ./test datei
Scheinbar hat -exec mit `` oder | Probleme ..
Was nun aber funktioniert ist folg. leider etwas umständlich(2 x sed) und auch buggy: funkt z.b. mit "foo bar_foobardoo" nicht
for i in `find . -type f -name "*\ *"|sed s/\ /_/g`; do echo `echo $i |sed s/_/\ /g` $i;done
./test datei ./test_datei
Bye, Stephan
On Sat, Feb 26, 2000 at 07:14:37PM +0100, Stephan Goetter wrote:
Hi,
ich hab kein Problem, mich interessiert nur genau warum folg. klappt (ich will Dateien mit einem Leerzeichen umbenennen ' ' -> '_')
find . -type f -name "*\ *" -exec echo {} `echo "{}"|sed s/\ /_/g` ;
./test datei ./test datei
Warum das so ist habe ich noch nicht rausbekommen. Wenn man alles zwischen -exec und ; einer extra shell gibt, klappt alles:
find . -type f -name "*\ *" -exec sh -c 'echo $0 `echo $0|sed s//_/g`' {} ;
Scheinbar hat -exec mit `` oder | Probleme ..
MMh. Irgendie komisch. Das sed wird in deiner obigen Variante jedenfalls auch aufgerufen, bekommt aber den Output von echo "{}" nicht ueber die Pipe. Prinzipiell funktioniert aber eine pipe auch innerhalb von `` Bsp:
rf11@max:~/tmp> echo `echo x|sed s/x/y/` y rf11@max:~/tmp>
Was nun aber funktioniert ist folg. leider etwas umständlich(2 x sed) und auch buggy: funkt z.b. mit "foo bar_foobardoo" nicht
for i in `find . -type f -name "*\ *"|sed s/\ /_/g`; do echo `echo $i |sed s/_/\ /g` $i;done
In der Art haette ich auch noch einen:
find . -type f -name "*\ *"|(while read x; do echo $x `echo $x|sed s//_/g`; done)
Nettes Problem jedenfalls!
Reinhard
Am Sam, 26 Feb 2000 schrieb Reinhard Foerster:
In der Art haette ich auch noch einen: find . -type f -name "*\ *"|(while read x; do echo $x `echo $x|sed s//_/g`; done)
Was jetzt bloß noch doof ist, das wenn ich echo durch mv ersetze, meckert mv mv: Beim Verschieben mehrerer Dateien muß das letzte Argument ein Verzeichnis sein
Also muss man aus "foo bar" noch irgendwie "foo\ bar" machen, mit ein bißchen probieren hab ich dann folg. bekommen
find . -type f -name "*\ *"|(while read x; do echo `echo $x|sed "s/\ /\\\ /g"` `echo $x|sed s/\ /_/g`; done)
bei echo ist mit 5 und 6 mal \ die Ausgabe foo\ bar
aber mv meckert immer noch.
Vereinfacht sieht das problem so aus:
mv `echo foo bar |sed "s/\ /\\\ /g"` /tmp
mv: foo: Datei oder Verzeichnis nicht gefunden mv: bar: Datei oder Verzeichnis nicht gefunden
mit der Datei "foo bar"
Hat jemand eine Idee ?
Danke, Bye, Stephan
On Sat, Feb 26, 2000 at 10:40:52PM +0100, Stephan Goetter wrote:
Also muss man aus "foo bar" noch irgendwie "foo\ bar" machen, mit ein bißchen probieren hab ich dann folg. bekommen
[...]
Hat jemand eine Idee ?
Ich halte es fuer einfacher mit "foo bar" statt foo\ bar zu arbeiten. Jetzt mal der Leserlichkeit wegen als Miniskript.
#!/bin/sh # namen duerfen \ oder \n nicht enhalten, ' ´ ` " $ u.a. klappen find . -type f -name "*\ *" | \ while read x ; do y=`echo $x | sed s/\ /_/g` mv "$x" "$y" done
Reinhard
Hallo Stefan, nochmal zu deinem:
find . -name "*\ *" -exec echo {} `echo "{}"|sed s/\ /_/g` ;
Ich weiss jetzt was schief geht: Zuerst wird `echo "{}"|sed s/\ /_/g` evaluiert (also der String '{}' durch das sed geschickt mit dem Ergebnis '{}'. Dieses '{}' wird danach vom find mit dem gefundenen File ersetzt.
Du machst also nix anderes als:
find . -name "*\ *" -exec echo {} {} ;
Wie ich darauf gekommen bin:
rf11@max:~/tmp> ls -l total 2 -rw-r--r-- 1 rf11 users 0 Feb 26 21:50 s p a c e -rw-r--r-- 1 rf11 users 0 Feb 26 21:51 s p a c e 2 rf11@max:~/tmp> find . -name "*\ *" -exec echo {} `echo "{}" ` ; ./s p a c e 2 ./s p a c e 2 ./s p a c e ./s p a c e rf11@max:~/tmp> find . -name "*\ *" -exec echo {} `echo "{}" > xxx ` ; ./s p a c e 2 ./s p a c e rf11@max:~/tmp> cat xxx {} rf11@max:~/tmp>
Reinhard
lug-dd@mailman.schlittermann.de