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?


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


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

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


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 *(/)

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

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'"

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:^\./::'

☀ 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 .*/


6

Verwenden Sie diese Option, um eine Liste der Verzeichnisse abzurufen

ls -d */ | sed -e "s/\///g"

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 '^\.'


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.


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.


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.


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*"

1

Das hat bei mir funktioniert:

`ls -F | grep /`

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


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

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.


0

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


0

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


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 * /


Haben Sie einen guten Grund, bereits vorhandene Antworten zu duplizieren?
Maxim Sagaydachny
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.