Hallo, On Tue, 11 Feb 2003, Jan Trippler wrote:
On Mon, 10 Feb 2003 at 13:17 (+0100), David Haller wrote:
On Mon, 10 Feb 2003, Jens Wolfgarten wrote:
Ich versuche vergeblich, mit folgendem Skript alle Leerzeichen in einigen Dateien zu eliminieren.
for alt in $(find . -type f); do neu="$(find . -type f | tr '[A-Z ]' ^^^^^^^^^^^^^^^^^das ist dein Problem. '[a-z_]')"; mv "$alt" "$neu"; done
Kann mir jemand sagen, wie ich es schaffe, daß im aktullen Verzeichnis alle Leerzeichen in Dateinamen durch _ ersetzt werden?
find . -type f -name "* *" | while read alt; do neu="$(echo \"$alt\" | tr '[A-Z ]' '[a-z_]')"; mv -i "$alt" "$neu"; done
Na na, David! Wo bleibt denn Dein kritischer Blick? ;-)
Dem fehlt die Uebung an/mit dir! :)
Das angegebene Konstrukt wandelt eben nicht nur im aktuellen Verzeichnis Dateinamen um (BTW auch gleich Groß- in Kleinbuchstaben), sondern rekursiv
Jo, das -maxdepth 1 hab ich vergessen ;( Der Rest sind dann Folgefleher (sic!). [..]
Ach ja, mir fiel gerade noch was anderes auf: jan@k500:~/tmp/tst/l e e r> ls n o c h l e e r e r jan@k500:~/tmp/tst/l e e r> ls | tr ' ' '_' n_o_c_h___l_e_e_r_e_r jan@k500:~/tmp/tst/l e e r> echo `ls` | tr ' ' '_' n_o_c_h_l_e_e_r_e_r jan@k500:~/tmp/tst/l e e r> echo "`ls`" | tr ' ' '_' n_o_c_h___l_e_e_r_e_r
Da rationalisiert der echo offenbar *überflüssige* Leerzeichen weg - es sind für ihn ja nur Argumenttrenner *hrmpf*
Eben. Das echo bekommt eben nicht '"n o c h l e e r e r"' zu sehen, sondern '"n" "o" "c" "h" "l" "e" "e" "r" "e" "r"'. Wichtig ist dabei, was _vor_ der Pipe passiert. 'tr' interessiert das doch alles nicht die Bohne. Aber echo! Einfach mal das |tr weglassen... Denn `ls` expandiert zu 'n o c h l e e r e r'. Und das wiederum (beachte IFS!) wird dann von echo interpretiert... Hier mal mit 'for f in' statt dem echo [1]: dh@slarty$ ls dh@slarty$ touch 'n o c h l e e r e r' dh@slarty$ for f in `ls`; do echo "\'$f\'"; done | xargs echo 'n' 'o' 'c' 'h' 'l' 'e' 'e' 'r' 'e' 'r' dh@slarty$ for f in "`ls`"; do echo "\'$f\'"; done | xargs echo 'n o c h l e e r e r' dh@slarty$ touch 'l e e r' dh@slarty$ for f in `ls`; do echo "\'$f\'"; done | xargs echo 'l' 'e' 'e' 'r' 'n' 'o' 'c' 'h' 'l' 'e' 'e' 'r' 'e' 'r' dh@slarty$ for f in "`ls`"; do echo "\'$f\'"; done | xargs echo 'l e e r n o c h l e e r e r' dh@slarty$ find . -type f -maxdepth 1 -exec echo "'{}'" \; './n o c h l e e r e r' './l e e r' dh@slarty$ find . -type f -maxdepth 1 -exec echo "{}" \; | tr ' ' '_' ./n_o_c_h___l_e_e_r_e_r ./l_e_e_r dh@slarty$ find . -type f -maxdepth 1 | tr ' ' '_' ./n_o_c_h___l_e_e_r_e_r ./l_e_e_r Fazit: [for +] ls + echo Kombinationen will man nicht bei kranken Dateinamen.
Und schon habe ich wieder einen Grund, bei der traditionellen Syntax mit `` statt $() zu bleiben:
Wo ist hier dabei der Unterschied? -dnh [1] prompt wg. Zeilenlaenge gekuerzt -- [NTFS] it's the Not Trustworthy File System until all files are gone. Then it automagically switches to be the Nothing There File System. That's not a bug. That's a feature. -- Peter Eckhardt in dasr