it-swarm.com.de

Wie liste ich Ordner mit Bash-Befehlen auf?

Gibt es eine Möglichkeit, nur die Ordner in einem Verzeichnis mit Bash-Befehlen aufzulisten? (Da der Befehl ls alle Dateien und Ordner auflistet)

52
SpiXel

Sie können verwenden:

ls -d -- */

Da alle Verzeichnisse mit / enden, werden nur die Verzeichnisse im aktuellen Pfad aufgelistet. Die Option - d stellt sicher, dass nur die Verzeichnisnamen gedruckt werden, nicht deren Inhalt.

64
Gaff

Stephen Martins Antwort warnte und listete auch den aktuellen Ordner auf, also würde ich vorschlagen

find . -mindepth 1 -maxdepth 1 -type d

(Dies ist unter Linux. Ich konnte -maxdepth und -mindepth in der POSIX-Manpage für find nicht finden.)

28
daniel kullmann
find . -maxdepth 1 -type d

Listet nur Ordner auf. Und wie Teddy hervorhob, brauchst du -maxtiefe, um die Wiederverwendung in Unterverzeichnisse zu verhindern

12
0x7c0

Daniels Antwort ist richtig. Hier sind jedoch einige nützliche Ergänzungen.

Versuchen Sie Folgendes, um zu vermeiden, versteckte Ordner (wie .git) aufzulisten:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \)

Und um den gefürchteten Punkt-Schrägstrich am Anfang der Ausgabe von find zu ersetzen, verwenden Sie diesen Befehl:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'
6
Mathias Bynens

Sie sollten die Ausgabe von ls "nicht analysieren", oder so wird gesagt. Die Begründung dahinter ist, dass die Ausgabe für Menschen lesbar sein soll und das Parsen unnötig kompliziert machen kann, wenn ich mich recht entsinne.

wenn Sie ls oder find nicht möchten, können Sie versuchen, "*" mit "[-d]" zu filtern.

Ich habe genau das getan, aus irgendeinem Grund funktionierten ls und find nicht (Dateinamen mit Leerzeichen und Klammern, denke ich, oder etwas anderes, das ich übersah), dann habe ich etwas in der Art von

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
1

printf "%s\n" */ listet alle Verzeichnisse im $ PWD auf.

echo */ funktioniert auch, aber in einer langen einzeiligen Zeile ist es schwieriger, wenn Namen Leerzeichen enthalten.

0
user353322

Sie können auch verwenden:

du

Oder:

git ls-tree -d -r --name-only @
0
Steven Penny

Nur um etwas zu betonen, das mich hier draußen in Bezug auf die Auswahl der Glob-Muster verwirrt hat; sag du hast das:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

Angenommen, Sie möchten hier nur Verzeichnisse mit mydir* auswählen. Beachten Sie, dass ls -d auch Dateien auflistet, wenn Sie den abschließenden Schrägstrich weglassen:

$ ls -d testglob/mydir*   # also `ls -d -- testglob/mydir*`
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... mit einem abschließenden Schrägstrich werden jedoch nur Verzeichnisse aufgelistet:

$ ls -d testglob/mydir*/   # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/
0
sdaau