Gibt es eine korrekte Möglichkeit, die Unterverzeichnisse des aktuellen Verzeichnisses aufzulisten?

10

Ich kann die Unterverzeichnisse eines Verzeichnisses von finden

ls -d -- */

oder

ls -l | grep "^d"

aber beide scheinen indirekt zu sein, und ich würde mir vorstellen, dass es einen Standardweg gibt, um nur die Verzeichnisse zu finden. Gibt es einen richtigen Weg, dies zu tun? Und wenn nicht, führt beides zu unerwünschtem Verhalten in Randfällen? (Symbolische Links, versteckte Verzeichnisse usw.)

Eric Wilson
quelle

Antworten:

17

Die Antwort hängt mehr davon ab, was Sie mit der Ausgabe tun möchten, als davon, wonach Sie suchen. Wenn Sie nur eine Liste als visuelle Referenz am Terminal sehen möchten, ist Ihre erste Lösung eigentlich ziemlich nett. Wenn Sie die Ausgabe verarbeiten möchten, sollten Sie eine andere Methode verwenden.

Eine der robustesten Möglichkeiten, eine Liste in ein anderes Programm einzuspeisen, ist die Verwendung find.

find -maxdepth 1 -type d

Der Grund, warum dies für Feeds gut ist, besteht darin, dass finddie durch Nullen getrennten Daten mithilfe von Zeichenfolgen ausgegeben -print0oder ordnungsgemäß als Argumente für andere Programme verwendet werden können -exec. Informationen dazu, warum dies besser ist als das Parsen der Ausgabe von ls, finden Sie unter ParsingLS in Gregs Wiki.

Caleb
quelle
4
Ich musste tippen find . -maxdepth 1 -type d, damit dies unter OS X Yosemite funktioniert.
Sean Levin
1
Um die Unterverzeichnisse aufzulisten, muss man auch -mindepth wie in angeben find . -maxdepth 1 -mindepth 1 -type d. Andernfalls wird das aktuelle Verzeichnis .eingeschlossen.
Tinlyx
5

Zu Ihrer Information - In ZSH (aber nicht BASH) können Sie dies auch tun : ls -d -- *(/); Der (/)Modifikator weist ZSH nur an globale Verzeichnisse an.

Das heißt, es unterscheidet sich nicht sehr von Ihrer eigenen vorgeschlagenen Lösung ( ls -d -- */), und es ist weit vom Standard entfernt.

Soweit die Ausgabe von ls(die sich wahrscheinlich aufgrund anderer Flags unterscheidet):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2
Curtis F.
quelle
zsh erweitert das Sternchen auf alle Dateien und Verzeichnisse. Das Flag (/) wählt Teile dieser Erweiterung aus, sodass ls * (/) ebenso funktionieren würde wie echo * (/) oder zshly print -l * (/ ) . Die beiden ersten Versionen funktionieren auch in Bash.
Thor
1
Beachten Sie, dass die *(/)Erweiterung zu den nicht ausgeblendeten Verzeichnissen erfolgt, während die */Erweiterung zu nicht ausgeblendeten Verzeichnissen oder Symlinks zu Verzeichnissen (oder zumindest zu Symlinks zu Pfaden, für die wir feststellen können, dass es sich um Verzeichnisse handelt) erweitert wird.
Stéphane Chazelas