Kann jemand erklären, warum ls -dnur gibt .und warum das */am Ende hinzugefügt werden muss, damit es funktioniert?
KWD
3
@cwd Wenn Sie keine Dateien angeben, ist der lsStandardwert "" .. Und -dbedeutet, dass Sie den Inhalt des Verzeichnisses nicht drucken, sondern das Verzeichnis selbst drucken.
Mikel
1
@cwd versuchen, ls -pes zu verwenden, zeigt die /nach den Verzeichnisnamen. Es */handelt sich also nur um ein Muster, das mit dem Verzeichnisnamen und der /Kombination abgeglichen wird .
Pitt
Ich habe eine Funktion erstellt, die die Antwort von @ Steven_D für meine ~ / .bash_aliases-Datei implementiert
rjurney
Antworten:
84
Ich weiß, dass es bereits eine ausgewählte Antwort gibt, aber Sie können das angeforderte Verhalten mit nur erhalten ls:
ls -ld -- */
(Beachten Sie, dass das '-' das Ende der Parameter markiert und verhindert, dass Ordnernamen, die mit einem Bindestrich beginnen, als weitere Befehlsoptionen interpretiert werden.)
Dadurch werden alle nicht ausgeblendeten Verzeichnisse (es sei denn, Sie konfigurieren die Globs Ihrer Shell, um sie zu erweitern) im aktuellen Arbeitsverzeichnis aufgelistet, in dem sie ausgeführt werden (beachten Sie, dass sie auch symbolische Links zu Verzeichnissen enthalten). Um alle Unterverzeichnisse eines anderen Ordners abzurufen, versuchen Sie einfach:
Nett. Ich habe nie darüber nachgedacht, dass Verzeichnisse /am Ende implizit sind - aber jetzt, wo ich sehe, dass Sie antworten, macht es Sinn. Immerhin fügt es die Tab-Vervollständigung hinzu.
gvkv
-d for dir, -l for long format. Was ist der Zweck von --?
Dineshkumar
1
Obwohl dies kurz aussieht und in den meisten Fällen funktioniert, kann es sein, dass Sie diesen Ansatz nicht verwenden möchten, wenn ein echtes Verzeichnis benötigt wird, nicht der Symlink eines Verzeichnisses. Ist findalso eigentlich eine gute Wahl in diesem Fall.
Biocyberman
1
findhat auch den Vorteil, wenn die Anzahl der Verzeichnisse die maximale Argumentlänge überschreitet.
Steven D
Arbeiten nach hinten, ich habe gerade Sie einfach alles mit einer Erweiterung ignorieren können: ls -alhF --ignore=*.*. Ich .myHiddenFolder
bin
14
Nein, aber ein einfacher findBefehl wird es tun:
find . -type d -depth 1
oder grep
ls -F | grep /
Sie können dann bei Bedarf einen der beiden Aliasnamen verwenden.
Auf Ubuntu 14.04 war es -maxdepth 1. findIch wollte auch, dass ich die Bestellung find . -maxdepth 1 -type d
umdrehe
Diese ls -F | grep /Lösung wirkt Wunder! Es scheint das einzige zu sein, das ich auf meinem FreeBSD-Rechner zum Arbeiten bringen kann. Ich denke mit Fisch bedeutet, dass etwas mit */möglicherweise nicht funktioniert?
cjm
Ich habe noch nie mit Fish gearbeitet, daher bin ich mir nicht sicher, aber die Option -F kann Wunder wirken.
GVKV
7
Ich mag das Baum- Dienstprogramm, um einen Überblick über die Verzeichnisstruktur zu bekommen. Es ist in MacPorts und allen Linux-Distributionen verfügbar, die ich ausprobiert habe.
tree -d -L 2
Das würde alle Verzeichnisse anzeigen, zwei Ebenen tief.
Mit zsh(wie es standardmäßig unter macOS /bin/shvorhanden war), würden Sie Glob-Qualifikatoren verwenden, um Dateien basierend auf ihrem Typ auszuwählen:
Nicht ausgeblendete Verzeichnisse auflisten:
ls -d -- *(/)
Alle Verzeichnisse auflisten:
ls -d -- *(D/)
( .und ..sind immer ausgeschlossen, fügen Sie sie einzeln hinzu, wenn Sie sie wollen)
Fügen Sie auch Symlinks zu Verzeichnissen hinzu:
ls -d -- *(D-/)
( -Lässt also nach Symlink-Auflösung weitere Qualifier gelten).
Es ist schön zu wissen, dass ich nicht die einzige Person bin, die den grep "^d"Hack benutzt
Michael Mrozek
6
Soweit ich weiß, ist das von ihm beschriebene Verhalten kein Fehler und dasselbe, wenn man GNU ls verwendet. Die Option -d zeigt die Liste für das Verzeichnis und nicht den Inhalt an. Um zu sehen, warum dies nützlich sein kann, sehen Sie den Unterschied zwischen: ls -l /homeundls -dl /home
Steven D
Karat ist nichts Besonderes für die Schale. Sie können nur verwenden ls -l / | grep ^d. Wenn Sie werden gehen Anführungszeichen verwenden, da Sie keine Parameter Expansion benötigen, machen sie einzelne Anführungszeichen. ls -l / | grep '^d'. Ja, ich bin ein Pedant. Aber wirklich, mach das. :)
Wildcard
-1
$ ls -p | grep /
Das -pFlag lsfügt nach jedem Dateinamen einen Schrägstrich (`/ ') ein, wenn es sich bei dieser Datei um ein Verzeichnis handelt.
Am einfachsten ist es, den folgenden Befehl einzugeben. Dies funktioniert auf den meisten UNIX- und Linux-Plattformen und -Versionen. Sie können das überspringen, -Fwenn Sie möchten, aber es ist das Argument, das das / am Ende des Verzeichnisnamens anfügt. Das -CArgument erfasst nur Verzeichnisnamen - alle im aktuellen Verzeichnis. Wenn Sie nur Verzeichnisse und Unterverzeichnisse im aktuellen Pfad anzeigen möchten, fügen Sie einfach das -RArgument ( ls -CFR) hinzu.
In allen lsImplementierungen, die ich kenne und in der POSIX-Spezifikation von ls, -Cist die Ausgabe in Spalten , nicht Nicht-Verzeichnisdateien zu überspringen. In Ihrem Beispiel /werden die vor den Dateinamen gedruckt, was keine lsImplementierung tun würde. Mit -F, /wird an den Dateinamen für Verzeichnisdateien angehängt.
Stéphane Chazelas
Als ich diese Antwort sah, fragte ich mich: "Wo ist das wahr?"
G-Man
-3
ls -G
Dadurch werden Ihre Verzeichnisse in blau angezeigt
ls -d
nur gibt.
und warum das*/
am Ende hinzugefügt werden muss, damit es funktioniert?ls
Standardwert "".
. Und-d
bedeutet, dass Sie den Inhalt des Verzeichnisses nicht drucken, sondern das Verzeichnis selbst drucken.ls -p
es zu verwenden, zeigt die/
nach den Verzeichnisnamen. Es*/
handelt sich also nur um ein Muster, das mit dem Verzeichnisnamen und der/
Kombination abgeglichen wird .Antworten:
Ich weiß, dass es bereits eine ausgewählte Antwort gibt, aber Sie können das angeforderte Verhalten mit nur erhalten
ls
:(Beachten Sie, dass das '-' das Ende der Parameter markiert und verhindert, dass Ordnernamen, die mit einem Bindestrich beginnen, als weitere Befehlsoptionen interpretiert werden.)
Dadurch werden alle nicht ausgeblendeten Verzeichnisse (es sei denn, Sie konfigurieren die Globs Ihrer Shell, um sie zu erweitern) im aktuellen Arbeitsverzeichnis aufgelistet, in dem sie ausgeführt werden (beachten Sie, dass sie auch symbolische Links zu Verzeichnissen enthalten). Um alle Unterverzeichnisse eines anderen Ordners abzurufen, versuchen Sie einfach:
Beachten Sie, dass -l optional ist.
quelle
/
am Ende implizit sind - aber jetzt, wo ich sehe, dass Sie antworten, macht es Sinn. Immerhin fügt es die Tab-Vervollständigung hinzu.-d for dir, -l for long format
. Was ist der Zweck von--
?find
also eigentlich eine gute Wahl in diesem Fall.find
hat auch den Vorteil, wenn die Anzahl der Verzeichnisse die maximale Argumentlänge überschreitet.ls -alhF --ignore=*.*
. Ich.myHiddenFolder
Nein, aber ein einfacher
find
Befehl wird es tun:oder
grep
Sie können dann bei Bedarf einen der beiden Aliasnamen verwenden.
quelle
-maxdepth 1
.find
Ich wollte auch, dass ich die Bestellungfind . -maxdepth 1 -type d
ls -F | grep /
Lösung wirkt Wunder! Es scheint das einzige zu sein, das ich auf meinem FreeBSD-Rechner zum Arbeiten bringen kann. Ich denke mit Fisch bedeutet, dass etwas mit*/
möglicherweise nicht funktioniert?Ich mag das Baum- Dienstprogramm, um einen Überblick über die Verzeichnisstruktur zu bekommen. Es ist in MacPorts und allen Linux-Distributionen verfügbar, die ich ausprobiert habe.
Das würde alle Verzeichnisse anzeigen, zwei Ebenen tief.
quelle
Ich musste auch versteckte Verzeichnisse anzeigen, also habe ich den obigen Vorschlag an meine Bedürfnisse angepasst
(abhängig von der Shell, die auch
.
und enthalten kann..
)quelle
Mit
zsh
(wie es standardmäßig unter macOS/bin/sh
vorhanden war), würden Sie Glob-Qualifikatoren verwenden, um Dateien basierend auf ihrem Typ auszuwählen:Nicht ausgeblendete Verzeichnisse auflisten:
Alle Verzeichnisse auflisten:
(
.
und..
sind immer ausgeschlossen, fügen Sie sie einzeln hinzu, wenn Sie sie wollen)Fügen Sie auch Symlinks zu Verzeichnissen hinzu:
(
-
Lässt also nach Symlink-Auflösung weitere Qualifier gelten).quelle
Ich denke, ls hat einen Fehler unter Mac OS X. Ein Workaround ist die Verwendung von grep ...
ls -l / | grep "^d"
quelle
grep "^d"
Hack benutztls -l /home
undls -dl /home
ls -l / | grep ^d
. Wenn Sie werden gehen Anführungszeichen verwenden, da Sie keine Parameter Expansion benötigen, machen sie einzelne Anführungszeichen.ls -l / | grep '^d'
. Ja, ich bin ein Pedant. Aber wirklich, mach das. :)Das
-p
Flagls
fügt nach jedem Dateinamen einen Schrägstrich (`/ ') ein, wenn es sich bei dieser Datei um ein Verzeichnis handelt.quelle
Am einfachsten ist es, den folgenden Befehl einzugeben. Dies funktioniert auf den meisten UNIX- und Linux-Plattformen und -Versionen. Sie können das überspringen,
-F
wenn Sie möchten, aber es ist das Argument, das das / am Ende des Verzeichnisnamens anfügt. Das-C
Argument erfasst nur Verzeichnisnamen - alle im aktuellen Verzeichnis. Wenn Sie nur Verzeichnisse und Unterverzeichnisse im aktuellen Pfad anzeigen möchten, fügen Sie einfach das-R
Argument (ls -CFR
) hinzu.quelle
ls
Implementierungen, die ich kenne und in der POSIX-Spezifikation vonls
,-C
ist die Ausgabe in Spalten , nicht Nicht-Verzeichnisdateien zu überspringen. In Ihrem Beispiel/
werden die vor den Dateinamen gedruckt, was keinels
Implementierung tun würde. Mit-F
,/
wird an den Dateinamen für Verzeichnisdateien angehängt.Dadurch werden Ihre Verzeichnisse in blau angezeigt
quelle