Leerzeichen im Verzeichnisnamen

Hinweis: In dem Thema Leerzeichen im Verzeichnisnamen gibt es 4 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • Hallo,


    ich habe mir ein kleines Skript geschrieben, welches alle meine Bilder verkleinern soll. Dazu nutze ich find, um die Dateien zu ermitteln und eine for-Schleife, um die Dateien zu konvertieren.


    Ich habe jedoch immer dann ein Problem, wenn im Pfad ein Leerzeichen auftritt, dass der Teil vor und der Teil nach dem Leerzeichen jeweils als eigenes Verzeichnis bzw. Datei interpretiert wird. Ich habe schon jede Menge Quotes verwendet bzw. ausprobiert, aber irgendwie komm ich hier nicht weiter.


    Beispiel: Ich habe folgende Verzeichnisstruktrur
    /home/wegabjm/test/
    /home/wegabjm/test/01_test/
    /home/wegabjm/test/02 test/


    Damit interpretiert die folgende Schleife jedoch den Teil vor und nach dem Leerzeichen als separate Verzeichnisse. Ich verwende hier mal nur die Verzeichnisse, also "-type d". Den Pfeil "->" habe ich mal aufgenommen, damit man sieht, wie oft die Schleife durchlaufen wird.

    Code
    for f in $(find /home/wegabjm/test/ -type d); do echo "-> $f"; done
    -> /home/wegabjm/test/
    -> /home/wegabjm/test/01_test
    -> /home/wegabjm/test/02
    -> test


    Wenn ich das so mache, dann wird alles was find liefert genau als ein Argument angesehen, die Schleife also nur einmal durchlaufen.

    Code
    for f in "$(find/home/wegabjm/test/ -type d)"; do echo "-> $f"; done
    -> /home/wegabjm/test/
    /home/wegabjm/test/01_test
    /home/wegabjm/test/02 test


    Weiß jemand von Euch, wie das Problem lösbar ist?
    Besten Dank vorab, für Euche Postings.


    Gruß wegabjm

    Für den Inhalt des Beitrages 34621 haftet ausdrücklich der jeweilige Autor: wegabjm

  • Hallo wegabjm,


    Bin nicht sicher ob ich Dich richtig verstehe, aber würde denn folgendes nicht genügen:


    Code
    for f in /home/wegabjm/test/*; do echo "-> $f"; done


    Gruss,
    Roland

    Für den Inhalt des Beitrages 34622 haftet ausdrücklich der jeweilige Autor: rme

  • Hallo rme,


    hey, super Lösung! Macht genau was es soll!


    Jetzt muss nur noch verstehen, warum hier nur die Verzeichnisse aufgelistet werden und nicht auch die Dateien im Verzeichnis. Hast Du dafür eine Erklärung?


    Danke!

    Für den Inhalt des Beitrages 34639 haftet ausdrücklich der jeweilige Autor: wegabjm

  • Zitat


    Jetzt muss nur noch verstehen, warum hier nur die Verzeichnisse aufgelistet werden und nicht auch die Dateien im Verzeichnis. Hast Du dafür eine Erklärung?


    Hast Du dies möglicherweise umgekehrt gemeint?


    Im folgendenwerden alle Dateien (inkl. Verzeichnisse sofern vorhanden) in "/home/wegabjm/test" aufgelistet.


    Code
    for f in /home/wegabjm/test/*; do echo "-> $f"; done


    Die Liste ist aber nicht rekursiv, d.h., wenn da ein Verzeichnis mit Namen "verzeichnis":


    Code
    "/home/wegabjm/test/verzeichnis"


    existiert, dann wird das Verzeichnis aufgelistet aber nicht dessen Inhalt. Dann müsstest Du zusätzlich noch:


    Code
    for f in /home/wegabjm/test/verzeichnis/*; do echo "-> $f"; done


    ausführen (u.s.w. für noch tiefere Verzeichnisse).


    Mit 'find' kannst Du alle Dateien rekursiv auflisten. Im folgenden werden alle regulären Dateien aufgelistet, angefangen mit "/home/wegabjm/test"


    Code
    find /home/wegabjm/test -type f -print


    -print >>> jede Datei auf einer neuen Zeile
    -print0 >>> alle Dateien auf einer Zeile


    Im folgenden werden alle Verzeicnisse aufgelistet, angefangen mit "/home/wegabjm/test"


    Code
    find /home/wegabjm/test -type d -print


    Wenn Du "find" verwenden willst um etwas mit den gefundenen Dateien zu machen, dann sieht dies meist in etwa so aus:


    Code
    find /home/wegabjm/test -iname "*.dat" -print0 -exec cp {} <wohin> ";"


    Gruss,
    Roland

    Für den Inhalt des Beitrages 34641 haftet ausdrücklich der jeweilige Autor: rme

  • Ah, okay. Dann kann ich doch nicht mit Deinem ersten Vorschlag leben.

    Code
    for f in /home/wegabjm/test/*; do echo "-> $f"; done


    Grund:

    • fehlende Rekursion (die gibts bei find inklusive)
    • ich will auch bestimmte Verzeichnisse ausschließen

    Also, bleibt mir hier wohl nur der Weg, find mit der Option -print0 zu verwenden. Damit sollte es ja dann funtionieren.


    Ich hatte das auch schon einmal probiert, allerdings statt -print0 bisher mit -print und für die Folgeverarbeitung eine pipe genutzt, wobei ich das Skript mit dem Startverzeichnis als Parameter 1 ($1) übergeben habe.

    Code
    find "$1" -type f -iname='*.jpg' -print |
      while read f
      do 
    	echo "$f"
      done


    Wenn ich Deine Ausführung richtig verstehe, dann kann ich die Pipe mit dem -exec Parameter von find ersetzten?


    Gruß wegabjm

    Für den Inhalt des Beitrages 34643 haftet ausdrücklich der jeweilige Autor: wegabjm