Antworten:
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.
ls -d -- */
und ls -d */
?
--
wird üblicherweise verwendet, um das Ende von Optionen zu markieren, sodass eine Datei mit dem Namen -l
ls nicht als Formatoption für lange Auflistungen interpretiert wird.
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.)
ls -d -- */
Option, da find
auch 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
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 find
Ausgabe in einigen Umgebungen zu ersetzen :
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
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
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 -d
auch 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/
printf "%s\n" */
listet alle Verzeichnisse im $ PWD auf.
echo */
wird auch funktionieren, aber in einer langen einzeiligen, schwieriger, wenn Namen Leerzeichen haben.
Sie können auch verwenden:
du
Oder:
git ls-tree -d -r --name-only @