it-swarm.com.de

Wie ordne ich ls einem Array in Linux Bash zu?

array=${ls -d */}
echo ${array[@]}  

Ich habe drei Verzeichnisse: wweeqq. Ich möchte sie in einem Array und dann das Array drucken.

62
Jordin Youssef

Das wäre es

array=($(ls -d */))

BEARBEITEN: Eine allgemeinere Antwort finden Sie in der Lösung von Gordon Davisson (d. H. Wenn Ihre Dateinamen Sonderzeichen enthalten). Diese Antwort ist lediglich eine Syntaxkorrektur.

82
Aaron Okano

Sie sollten es nach Möglichkeit vermeiden, die Ausgabe von ls zu analysieren (siehe Gregs Wiki zu diesem Thema ). Grundsätzlich ist die Ausgabe von ls mehrdeutig, wenn die Dateinamen lustige Zeichen enthalten. Es ist auch in der Regel Zeitverschwendung. Wenn Sie in diesem Fall ls -d */ Ausführen, erweitert die Shell */ Zu einer Liste von Unterverzeichnissen (was bereits genau das ist, was Sie wollen) und übergibt diese Liste als Argumente an ls -d, Die sich alle ansieht, sagt "yep, das ist ein ordentliches Verzeichnis" und gibt es aus. Der Befehl ls macht nichts Sinnvolles!

Nun, ok, es macht eine Sache, die nützlich ist: Wenn es keine Unterverzeichnisse gibt, wird */ So belassen, wie es ist, ls wird nach einem Unterverzeichnis mit dem Namen "*" suchen, es nicht finden, drucken eine Fehlermeldung, dass es nicht existiert (zu stderr), und nicht das "* /" (zu stdout) drucken.

Die einfachere Möglichkeit, ein Array von Unterverzeichnisnamen zu erstellen, besteht darin, das Glob (*/) zu verwenden, ohne es an ls zu übergeben . . Um jedoch zu vermeiden, dass "* /" in das Array eingefügt wird, wenn es keine aktuellen Unterverzeichnisse gibt, sollten Sie zuerst nullglob setzen (siehe auch Gregs Wiki ):

shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
echo "${array[@]}"  # Note double-quotes to avoid extra parsing of funny characters in filenames

Wenn Sie eine Fehlermeldung drucken möchten, wenn keine Unterverzeichnisse vorhanden sind, sollten Sie dies selbst tun:

if (( ${#array[@]} == 0 )); then
    echo "No subdirectories found" >&2
fi
57
Gordon Davisson

Dies würde die Dateien in diesen Verzeichnissen Zeile für Zeile drucken.

array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"
6
konsolebox