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
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
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
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
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 .*/
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:
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.
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.
Antworten:
Versuchen Sie dies,
ls -d */
um Verzeichnisse im aktuellen Verzeichnis aufzulistenquelle
ls -al | grep '^d'
- das ist viel prägnanter.*/
Anzeige nur Elemente erzwingt, die mit einem Schrägstrich enden, der in diesem Fall ein Verzeichnis wäre, selbst wenn die-F
Option vonls
nicht verwendet wird. Ähnlichls *php
wie und wie alle Dateien angezeigt werden, die mitphp
einem Verzeichnis enden .echo */
werde es auch tunVersuche dies:
quelle
ls
Lösungenfind
ist 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.find * -maxdepth 0 -type d
.find
's-print0
oder-exec
Option.find
normalerweise nur die Ordner in Tiefe 1 ausgibt.Folgende
filtert grundsätzlich die Erweiterung von '*', dh alle Einträge im aktuellen Verzeichnis, nach der
-type d
Bedingung.Vorteil ist, dass die Ausgabe gleich ist wie
ls -1 *
, aber nur mit Verzeichnissen und Einträgen nicht mit einem Punkt beginnenquelle
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:
quelle
tree
?tree
nicht standardmäßig installiert (obwohl sie sich in den Repositorys befindet).tree
Befehl kein nativer Unix-Befehl ist (bitte korrigieren Sie mich, wenn ich falsch liege ).Da es Dutzende von Möglichkeiten gibt, ist hier eine andere:
quelle
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
Sie können einen Alias erstellen und in die Profildatei einfügen
quelle
quelle
Um die Verzeichnisse im aktuellen Arbeitsverzeichnis aufzulisten,
ls -d */
kann verwendet werden. Wenn Sie die versteckten Verzeichnisse auflisten müssen, verwenden Sie diesen Befehlls -d .*/
quelle
Verwenden Sie diese Option, um eine Liste der Verzeichnisse abzurufen
quelle
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 einfachgrep
löschen:find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
quelle
mindepth
, um loszuwerden.
! 😁Die Antwort hängt von Ihrer Shell ab .
In
zsh
können Sie beispielsweise Folgendes tun: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(1)
hat viele Verwendungszwecke, daher würde ich es auf jeden Fall empfehlenman find
.quelle
Sie können den
tree
Befehl mit seinemd
Schalter verwenden, um dies zu erreichen.siehe
man tree
für weitere Informationen.quelle
tree
. Na ja, war nicht meine Absicht, irgendjemandes Donner zu stehlen.Wenn ich dieses Verzeichnis habe:
ls -l
Um alle Verzeichnisse abzurufen, verwenden Sie -L, um Links aufzulösen:
ls -lL | grep '^d'
Ohne -L:
ls -l | grep '^d'
Das Verzeichnis conf_nagios fehlt.
quelle
quelle
Das hat bei mir funktioniert:
(Aber ich
echo */
wechsle zu wie von @nos erwähnt)quelle
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:
quelle
In Bash:
Listet alle Verzeichnisse auf
listet alle Verzeichnisse in Langform auf
listet alle Verzeichnisse, einschließlich versteckter Verzeichnisse, in Langform auf.
Ich habe kürzlich zu zsh (MacOS Catalina) gewechselt und festgestellt, dass:
funktioniert nicht mehr, wenn das aktuelle Verzeichnis keine versteckten Verzeichnisse enthält.
Der obige Fehler wird gedruckt, es können jedoch auch keine Verzeichnisse gedruckt werden.
Scheitert auch auf die gleiche Weise.
Bisher habe ich festgestellt, dass dies:
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:ls
Befehl ist die Shell für Liste Inhalt des aktuellen Verzeichnisses-l
wird das Flag , um anzugeben , dass Sie zur Liste wollen in Longford (ein Element pro Zeile + ein paar anderen coolen Informationen)-d
ist 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."Siehe
man 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.
quelle
du -d1
ist vielleicht die kürzeste Option. (Solange Sie die Eingabe nicht an einen anderen Befehl weiterleiten müssen.)quelle
Um nur Verzeichnisse in einem angegebenen Pfad aufzulisten, geben Sie einfach ls -l | ein grep drw
quelle
drw
, und Verzeichnisse ausschließen, die nicht vom Eigentümer gelesen und beschrieben werden können.grep ^d
funktioniert besser.Lange Liste der Verzeichnisse
Verzeichnisse auflisten
- ls -d * /
quelle