Ich habe ein Bash-Shell-Skript, das alle untergeordneten Verzeichnisse (aber keine Dateien) eines bestimmten Verzeichnisses durchläuft. Das Problem ist, dass einige der Verzeichnisnamen Leerzeichen enthalten.
Hier ist der Inhalt meines Testverzeichnisses:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
Und der Code, der die Verzeichnisse durchläuft:
for f in `find test/* -type d`; do
echo $f
done
Hier ist die Ausgabe:
Test / Baltimore Test / Kirsche Hügel Test / Edison Test / Neu York Stadt Test / Philadelphia
Cherry Hill und New York City werden als 2 oder 3 separate Einträge behandelt.
Ich habe versucht, die Dateinamen wie folgt zu zitieren:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
aber ohne Erfolg.
Es muss einen einfachen Weg geben, dies zu tun.
Die Antworten unten sind großartig. Um dies jedoch komplizierter zu machen, möchte ich nicht immer die in meinem Testverzeichnis aufgeführten Verzeichnisse verwenden. Manchmal möchte ich stattdessen die Verzeichnisnamen als Befehlszeilenparameter übergeben.
Ich nahm Charles 'Vorschlag an, das IFS einzurichten, und fand Folgendes:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
und dies funktioniert einwandfrei, es sei denn, die Befehlszeilenargumente enthalten Leerzeichen (auch wenn diese Argumente in Anführungszeichen stehen). Wenn Sie das Skript beispielsweise folgendermaßen aufrufen, test.sh "Cherry Hill" "New York City"
wird die folgende Ausgabe erzeugt:
Kirsche Hügel Neu York Stadt
list="$@"
verwirft die Liste des ursprünglichen Werts vollständig und reduziert sie zu einer Zeichenfolge. Bitte befolgen Sie die Praktiken in meiner Antwort genau wie angegeben - eine solche Aufgabe wird nirgendwo darin empfohlen; Wenn Sie eine Liste von Befehlszeilenargumenten an ein Programm übergeben möchten, sollten Sie diese in einem Array sammeln und dieses Array direkt erweitern.