Wie liste ich Ordner mit Bash-Befehlen auf?

52

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

SpiXel
quelle

Antworten:

66

Sie können verwenden:

ls -d -- */

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

Gaff
quelle
2
ls - * / listet alle Verzeichnisse mit ihrem Inhalt unten auf
Vins
1
@ 8088 Was ist der Unterschied zwischen ls -d -- */und ls -d */?
Louis
5
@Louis --wird üblicherweise verwendet, um das Ende von Optionen zu markieren, sodass eine Datei mit dem Namen -lls nicht als Formatoption für lange Auflistungen interpretiert wird.
Cristian Ciupitu
28

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.)

Daniel Kullmann
quelle
1
Ältere Frage, die ich kenne. Auch wenn ich mich anfangs nach dieser Aufgabe umsehen würde, gefällt mir die ls -d -- */Option, da findauch versteckte Wege zu finden sind. Das kann manchmal nützlich sein, aber auch manchmal Probleme verursachen. Ich hoffe, dieser Kommentar könnte anderen helfen. +1
Spieltag
12
find . -maxdepth 1 -type d

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

0x7c0
quelle
5
Sie wollen wahrscheinlich -maxdepth 1auch.
Teddy
6

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

Um zu vermeiden, dass versteckte Ordner (wie .git) angezeigt werden, versuchen Sie Folgendes:

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

Gehen Sie wie folgt vor, um den gefürchteten Punkt-Schrägstrich zu Beginn der findAusgabe in einigen Umgebungen zu ersetzen :

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

Sie sollten die Ausgabe von ls "nicht analysieren", oder so wird gesagt. Die Argumentation 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
der einzige Debianer
quelle
0

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 mydir*Verzeichnisse auswählen . Beachten Sie, dass, wenn Sie den abschließenden Schrägstrich weglassen, ls -dauch Dateien aufgelistet werden:

$ 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/
sdaau
quelle
0

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

echo */ wird auch funktionieren, aber in einer langen einzeiligen, schwieriger, wenn Namen Leerzeichen haben.


quelle