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
    

Anmelden zum Antworten