Bash: for ... in ... - geht das rekursiv?
-
Wie kann ich sowas einfach und schnell rekursiv machen? - Also dass Unterverzeichnisse auch durchsucht werden.
for file in * do echo ${file} done
-
Ich hab mir gerade sowas überlegt:
for file in `find *` ...
Nur das Problem ist, dass wenn ein Space im Namen ist das nicht mehr funktioniert. find müsste um jeden Dateinamen Anführungszeichen setzen oder so.
-
Was spricht gegen
for file in $(find) ...
?
-
.filmor schrieb:
Was spricht gegen
for file in $(find) ...
?
basher schrieb:
Nur das Problem ist, dass wenn ein Space im Namen ist das nicht mehr funktioniert. find müsste um jeden Dateinamen Anführungszeichen setzen oder so.
Wer lesen kann ist klar im Vorteil.
-
BTW:
Das mit den Anführungszeichen wird auch nicht funktionieren:
for file in $(find | sed s/^/\"/ | sed s/$/\"/); do echo $file; done
"./.wine/drive_c/Program Files/LucasArts/Star Wars Jedi Knight Jedi Academy/GameData/Base/saves/auto_kor1.sav"
Auch das Ersetzten des Leerzeichens durch ein Anderes funktioniert komischerweise nicht immer:
for file in $(find | sed s/\ /%20/); do echo ${file}; done
./.wine/drive_c/Program%20Files/LucasArts/Star Wars Jedi Knight Jedi Academy/GameData/Base/saves/jedi_14.sav
-
Höhö, ich bin aber auch blöd. Natürlich funktioniert das mit dem Ersetzen. Ich hab nur das g vergessen:
for file in $(find | sed s/\ /%20/g); do echo $file | sed s/%20/\ /g; done
./.wine/drive_c/Program Files/LucasArts/Star Wars Jedi Knight Jedi Academy/GameData/jamp.exe ./.wine/drive_c/Program Files/LucasArts/Star Wars Jedi Knight Jedi Academy/GameData/jasp.exe ./.wine/drive_c/Program Files/LucasArts/Star Wars Jedi Knight Jedi Academy/GameData/OpenAL32.dll
-
funktioniert aber nicht mehr wenn schon %20 in der datei steht (was gar nicht mal so ungewöhnlich ist).
find -exec kommt besser
oder zsh% for i in **/*; do...
Ansonsten kann man auch noch rekursiv mit cd in die unterverzeichnisse wechseln.
-
find bla | while read file; do echo $file; done
Sollte funktionieren solange kein \n im Dateinamen enthalten ist
-
hab da auch lange drüber gerätselt, hab folgende lösung gefunden:
export IFS=" " for file in $( find ) ; do echo $file done