Nur Verzeichnisse unter UNIX auflisten

219

Ich möchte nur die Verzeichnisse im angegebenen Pfad auflisten ( lshat keine solche Option). Kann dies auch mit einem einzeiligen Befehl erfolgen?

Sam
quelle
12
Für die Zukunft: Vielleicht sollten Fragen zu Unix / Linux-Grundlagen, die nicht so schwer mit der Programmierung zu tun haben, besser behandelt werden: unix.stackexchange.com
echox

Antworten:

315

Versuchen Sie dies, ls -d */um Verzeichnisse im aktuellen Verzeichnis aufzulisten

David Hancock
quelle
17
Hey, das ist ziemlich geschickt, ich habe uns immer daran gewöhnt ls -al | grep '^d'- das ist viel prägnanter.
Paxdiablo
43
warum * / ?? bitte erkläre!?
Chandeep
6
Ich habe keine richtige Erklärung, aber ich weiß, dass die */Anzeige nur Elemente erzwingt, die mit einem Schrägstrich enden, der in diesem Fall ein Verzeichnis wäre, selbst wenn die -FOption von lsnicht verwendet wird. Ähnlich ls *phpwie und wie alle Dateien angezeigt werden, die mit phpeinem Verzeichnis enden .
David Hancock
3
@ user975234 Jemand hat eine ähnliche Frage gestellt, und es gibt eine ziemlich gute Erklärung geposteten Link
user1766760
17
Ich echo */werde es auch tun
Nr.
95

Versuche dies:

find . -maxdepth 1 -type d
Robin
quelle
8
Für mich scheint dies so zu sein, wie es gemacht werden sollte. Im Gegensatz zu den vorgeschlagenen lsLösungen findist er allein für die Ausführung der Aufgabe verantwortlich (ohne sich auf die Erweiterung des Shell-Platzhalters zu verlassen, die Grenzen setzen kann). Es ist auch viel prägnanter.
Peterp
1
Das Schlimme daran ist, dass es nicht funktioniert, wenn Sie versuchen, die Ergebnisse zu durchlaufen, und Ihre Ergebnisse Leerzeichen in den Namen haben.
Ubiquibacon
2
Alternativ, wenn Sie das Verzeichnis selbst nicht einschließen möchten : find * -maxdepth 0 -type d.
James Ko
@ubiquibacon Verwenden Sie entweder find's -print0oder -execOption.
1
Das ist sehr langsam, zumindest auf meinem Mac. Es scheint die vollständige rekursive Suche durchzuführen, die findnormalerweise nur die Ordner in Tiefe 1 ausgibt.
Kara Brightwell
22

Folgende

find * -maxdepth 0 -type d

filtert grundsätzlich die Erweiterung von '*', dh alle Einträge im aktuellen Verzeichnis, nach der -type dBedingung.

Vorteil ist, dass die Ausgabe gleich ist wie ls -1 * , aber nur mit Verzeichnissen und Einträgen nicht mit einem Punkt beginnen

Radiospiel
quelle
13

Sie können ls -d */oder verwendentree -d

Eine andere Lösung wäre Globbing, dies hängt jedoch von der verwendeten Shell ab und davon, ob Globbing für Verzeichnisse unterstützt wird.

Zum Beispiel ZSH:

zsh # ls *(/)
Echox
quelle
3
Mit welchem ​​Unix-Geschmack bekommen Sie tree?
Johnsyweb
Zum Beispiel alle wichtigen Linux-Distrikte? Entschuldigung, ich verstehe die Frage nicht?
Echox
1
Ich habe eine Debian-Distribution und bin treenicht standardmäßig installiert (obwohl sie sich in den Repositorys befindet).
Stephen Schrauger
1
Downvotes, da ich glaube, dass der treeBefehl kein nativer Unix-Befehl ist (bitte korrigieren Sie mich, wenn ich falsch liege ).
Tiago Cardoso
10

Da es Dutzende von Möglichkeiten gibt, ist hier eine andere:

tree -d -L 1 -i --noreport
  • -d: Verzeichnisse
  • -L: Tiefe des Baumes (daher 1, unser Arbeitsverzeichnis)
  • -i: keine Einrückung, nur Namen drucken
  • --noreport: Keine Informationen am Ende der Baumliste melden
alleen1
quelle
Und danke, dass Sie die Schalter erklärt haben. Bei Stack Overflow geht es um Antworten. Ich weiß es immer zu schätzen, wenn Leute Sie mit einer Erklärung mögen, anstatt "Lesen Sie einfach den Manneintrag!" <- das ist keine Antwort.
Fusion27
Um von Zeile 2 zu beginnen (überspringen Sie die Zeile mit nur einem Punkt):tree -d -L 1 -i --noreport | tail -n +2
Adius
Dies ist die Lösung mit dem höchsten Rang, die Soft-Linked-Verzeichnisse auf nützliche Weise auflistet und sie als Link verfügbar macht. Ich bevorzuge die Variation:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel
9
ls -l | grep '^d'

Sie können einen Alias ​​erstellen und in die Profildatei einfügen

alias ld="ls -l| grep '^d'"
Somesh Chandra
quelle
1
Links werden mit diesem Befehl nicht angezeigt. Ein Link kann eine Datei oder ein Verzeichnis sein. Beispiel: lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> / lib / init / upstart-job.
C-Toesca
7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
mda
quelle
☀ finden. -maxdepth 1 -type d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: keine Übereinstimmungen gefunden: [^.] *
Michael Cole
6

Um die Verzeichnisse im aktuellen Arbeitsverzeichnis aufzulisten, ls -d */kann verwendet werden. Wenn Sie die versteckten Verzeichnisse auflisten müssen, verwenden Sie diesen Befehl ls -d .*/

kvivek
quelle
6

Verwenden Sie diese Option, um eine Liste der Verzeichnisse abzurufen

ls -d */ | sed -e "s/\///g"
Lakshmi
quelle
ls -d <Kunden-Verzeichnispfad> | sed -e "s / \ /// g" funktioniert nicht .. irgendwelche Hinweise?
Dhwanit
Danke dir! Ich wollte nur die Verzeichnisliste ohne alle Berechtigungen und das hat den Trick gemacht. :)
Codingjeremy
5

find specifiedpath -type d

Wenn Sie nicht in Unterverzeichnissen rekursiv arbeiten möchten, können Sie stattdessen Folgendes tun:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Beachten Sie, dass auch "Punkt" -Verzeichnisse (deren Name mit beginnt .) aufgelistet werden. aber nicht die speziellen Verzeichnisse .noch ... Wenn Sie keine "Punkt" -Verzeichnisse möchten, können Sie sie einfach greplöschen:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'

DomQ
quelle
1
Upvote für das Erwähnen mindepth, um loszuwerden .! 😁
Adius
5

Die Antwort hängt von Ihrer Shell ab .

In zshkönnen Sie beispielsweise Folgendes tun:

echo *(/)

Alle Verzeichnisse im aktuellen Arbeitsverzeichnis werden angezeigt.

Sehen man zshexpn für weitere Informationen.

Ein alternativer Ansatz wäre die Verwendung find(1), die für die meisten Unix- Varianten funktionieren sollte:

find . -maxdepth 1 -type d -print  

find(1)hat viele Verwendungszwecke, daher würde ich es auf jeden Fall empfehlen man find.

Johnsyweb
quelle
4

Sie können den treeBefehl mit seinem dSchalter verwenden, um dies zu erreichen.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

siehe man treefür weitere Informationen.

slm
quelle
Ich habe nicht abgelehnt, hatte nur die gleiche Frage. Es scheint, dass Ihre Antwort ein Betrüger von Echox ist, vielleicht ist das der Grund?.
Louis Waweru
1
@ Louis - danke, ich habe seine Erwähnung nie bemerkt tree. Na ja, war nicht meine Absicht, irgendjemandes Donner zu stehlen.
Slm
Upvoting für die Visualisierung dessen, was Baum tut
Andrejs
Ich glaube, die Abstimmungen sind, weil es die gleiche Antwort ist wie stackoverflow.com/a/3667405/523742
Tiago Cardoso
@TiagoCardoso - meine ist 2 Jahre älter als diese.
Slm
2

Wenn ich dieses Verzeichnis habe:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Um alle Verzeichnisse abzurufen, verwenden Sie -L, um Links aufzulösen:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Ohne -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Das Verzeichnis conf_nagios fehlt.

c-toesca
quelle
2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"
Surya
quelle
1

Das hat bei mir funktioniert:

`ls -F | grep /`

(Aber ich echo */wechsle zu wie von @nos erwähnt)

FractalSpace
quelle
1

Hier ist eine weitere Lösung, die verknüpfte Verzeichnisse anzeigt. Ich bevorzuge es etwas, weil es eine Teilmenge der "normalen" ls-l-Ausgabe ist:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
Amnon Harel
quelle
1

In Bash:

ls -d */

Listet alle Verzeichnisse auf

ls -ld */

listet alle Verzeichnisse in Langform auf

ls -ld */ .*/

listet alle Verzeichnisse, einschließlich versteckter Verzeichnisse, in Langform auf.


Ich habe kürzlich zu zsh (MacOS Catalina) gewechselt und festgestellt, dass:

ls -ld */ .*/

funktioniert nicht mehr, wenn das aktuelle Verzeichnis keine versteckten Verzeichnisse enthält.

zsh: no matches found: .*/

Der obige Fehler wird gedruckt, es können jedoch auch keine Verzeichnisse gedruckt werden.

ls -ld *(/) .*(/)

Scheitert auch auf die gleiche Weise.

Bisher habe ich festgestellt, dass dies:

ls -ld */;ls -ld .*/

ist eine anständige Problemumgehung. Das ;ist ein Befehlstrennzeichen. Wenn jedoch keine versteckten Verzeichnisse vorhanden sind, werden Verzeichnisse aufgelistet und der Fehler für keine versteckten Verzeichnisse ausgegeben:

foo
bar
zsh: no matches found: .*/

lsBefehl ist die Shell für Liste Inhalt des aktuellen Verzeichnisses
-lwird das Flag , um anzugeben , dass Sie zur Liste wollen in Longford (ein Element pro Zeile + ein paar anderen coolen Informationen)
-dist die Flagge alle Verzeichnisse zur Liste „als Dateien“ und nicht rekursiv
*/ist Das Argument 'Alle Dateien auflisten, die mit einem Schrägstrich enden'
*ist ein einfacher Regex-Befehl für "alles". */Die Shell wird daher aufgefordert, "alles aufzulisten, was mit '/' endet."

Sieheman ls für weitere Informationen.


Ich sage das:

alias lad="ls -ld */;ls -ld .*/"

in meiner .zshrc, und es scheint gut zu funktionieren.

HINWEIS: Das habe ich auch entdeckt

ls -ld .*/ 2> /dev/null

funktioniert nicht, da immer noch Fehler auf dem Terminal gedruckt werden. Ich werde meine Antwort aktualisieren, wenn ich eine Lösung finde.

DryLabRebel
quelle
0

du -d1ist vielleicht die kürzeste Option. (Solange Sie die Eingabe nicht an einen anderen Befehl weiterleiten müssen.)

Mohan
quelle
0

Um nur Verzeichnisse in einem angegebenen Pfad aufzulisten, geben Sie einfach ls -l | ein grep drw

Loui
quelle
Dies kann Dateien enthalten, sofern Dateinamen enthalten sind drw, und Verzeichnisse ausschließen, die nicht vom Eigentümer gelesen und beschrieben werden können. grep ^dfunktioniert besser.
Tom Zych
0

Lange Liste der Verzeichnisse

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Verzeichnisse auflisten
- ls -d * /

Athi
quelle
Haben Sie einen guten Grund, bereits vorhandene Antworten zu duplizieren?
Maxim Sagaydachny