Dieser Befehl listet Verzeichnisse im aktuellen Pfad auf: ls -d */
Was genau macht das Muster */
?
Und wie können wir den absoluten Pfad im obigen Befehl angeben (z. B. ls -d /home/alice/Documents
), um nur Verzeichnisse in diesem Pfad aufzulisten?
-d
tatsächlich bedeutet.Antworten:
*/
ist ein Muster, das mit allen Unterverzeichnissen im aktuellen Verzeichnis*
übereinstimmt ( würde mit allen Dateien und Unterverzeichnissen übereinstimmen ; das/
beschränkt es auf Verzeichnisse). Verwenden Sie ebenfalls, um alle Unterverzeichnisse unter / home / alice / Documents aufzulistenls -d /home/alice/Documents/*/
quelle
*/
keine versteckten Ordner übereinstimmen. Um sie einzuschließen, geben Sie sie entweder explizit wiels -d .*/ */
an oder setzen Sie diedotglob
Option in Bash.ls
für etwas verwenden, das nicht vorhanden ist.shopt -s nullglob
ls */
würde es auf just erweitertls
, wodurch alle Dateien im aktuellen Verzeichnis aufgelistet würden . Ich bin mir ziemlich sicher, dass Sie das in diesem Fall nicht wollen.Vier Möglichkeiten, dies zu erreichen, jeweils mit einem anderen Ausgabeformat
1. Verwenden von
echo
Beispiel:
echo */
,echo */*/
Hier ist , was ich habe:
2.
ls
Nur verwendenBeispiel:
ls -d */
Hier ist genau das, was ich bekommen habe:
Oder als Liste (mit Detailinfo):
ls -dl */
3. Verwenden von
ls
undgrep
Beispiel:
ls -l | grep "^d"
Folgendes habe ich bekommen:4. Bash-Skript (Nicht empfohlen für Dateinamen mit Leerzeichen)
Beispiel:
for i in $(ls -d */); do echo ${i%%/}; done
Folgendes habe ich bekommen:
Wenn Sie '/' als Endzeichen haben möchten, lautet der Befehl:
for i in $(ls -d */); do echo ${i}; done
quelle
3
war für mich merklich langsamer als die anderen. In dem Verzeichnis, das ich getestet habe:1
.012s,2
.016s,3
.055s ,4
.021s.1
ist mein Favorit.time
die Unix-Funktion verwendet. /// Ich stimme zu,echo */
ist schlauer alsls -d */
.1.
Option verursacht erhebliche Probleme beim Umgang mit Ordnernamen mit Leerzeichen.Ich benutze:
Dadurch wird eine einzelne Spalte ohne abschließenden Schrägstrich erstellt - nützlich in Skripten.
Meine zwei Cent.
quelle
-1
Option fürls
wird sowohl im einspaltigen Format als auch in ausgegebenls -1 -d */
.-1
immer noch ein abschließender Schrägstrich für jeden Eintrag ausgegeben wird..bashrc
Wie füge ich hinzu, wenn ich dies als Alias hinzufüge'/'
?'\/'
| sed -e 's-/$--'
Für alle Ordner ohne Unterordner:
Für alle Ordner mit Unterordnern:
quelle
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
Andernfalls schließen Sie sich/home/alice/Documents
selbst ein. Um Symlinks zu Verzeichnissen aufzunehmen, stellen Sie-L
4 (mehr) Zuverlässige Optionen.
Ein nicht zitiertes Sternchen
*
wird von der Shell als Muster (Glob) interpretiert.Die Shell verwendet es bei der Pfadnamenerweiterung.
Anschließend wird eine Liste von Dateinamen generiert, die dem Muster entsprechen.
Ein einfaches Sternchen entspricht allen Dateinamen im PWD (aktuelles Arbeitsverzeichnis).
Ein komplexeres Muster,
*/
das mit allen Dateinamen übereinstimmt, die auf enden/
.Also alle Verzeichnisse. Deshalb der Befehl:
1.- Echo.
wird (durch die Shell) auf
echo
alle Verzeichnisse im PWD erweitert.So testen Sie dies: Erstellen Sie ein Verzeichnis (
mkdir
) mit dem Namen test-dir und gebencd
Sie Folgendes ein :Erstellen Sie einige Verzeichnisse:
Der Befehl
echo ./*/
bleibt auch bei ungeraden Dateien zuverlässig:Aber die Leerzeichen in Dateinamen machen das Lesen etwas verwirrend.
Wenn
echo
wir stattdessenls
die Shell verwenden , wird die Liste der Dateinamen immer noch erweitert. Die Shell ist der Grund, eine Liste der Verzeichnisse im PWD abzurufen. Die-d
Option,ls
den aktuellen Verzeichniseintrag anstelle des Inhalts jedes Verzeichnisses aufzulisten (wie standardmäßig dargestellt).Dieser Befehl ist jedoch (etwas) weniger zuverlässig. Bei den oben aufgeführten ungeraden Dateien schlägt dies fehl. Es wird mit mehreren Namen ersticken. Sie müssen eine nach der anderen löschen, bis Sie diejenigen mit Problemen finden.
2.- ls
Die GNU
ls
akzeptiert die--
Taste "Ende der Optionen" ( ).3.-printf
Verwenden Sie Folgendes, um jedes Verzeichnis in einer eigenen Zeile aufzulisten (in einer Spalte, ähnlich wie ls -1):
Und noch besser, wir könnten das Nachlaufen entfernen
/
:Ein Versuch wie dieser:
Wird scheitern am:
ls -d */
) wie bereits oben gezeigt.IFS
.IFS
).4.- Funktion
Schließlich wirkt sich die Verwendung der Argumentliste in einer Funktion nicht auf die Argumentliste der aktuell ausgeführten Shell aus. Einfach:
präsentiert diese Liste:
Diese Optionen sind bei verschiedenen Arten von ungeraden Dateinamen sicher.
quelle
Das
tree
Befehl ist auch hier ziemlich nützlich. Standardmäßig werden alle Dateien und Verzeichnisse bis zu einer vollständigen Tiefe angezeigt, wobei einige ASCII-Zeichen den Verzeichnisbaum anzeigen.Wenn wir jedoch nur die Verzeichnisse ohne den ASCII-Baum und mit dem vollständigen Pfad aus dem aktuellen Verzeichnis abrufen möchten, können Sie Folgendes tun:
Die Argumente sind:
Wenn Sie dann den absoluten Pfad möchten, können Sie zunächst den vollständigen Pfad zum aktuellen Verzeichnis angeben:
Um die Anzahl der Unterverzeichnisse zu begrenzen, können Sie die maximale Ebene der Unterverzeichnisse festlegen
-L level
, z.Weitere Argumente können mit man tree gesehen werden
quelle
Falls Sie sich fragen, warum die Ausgabe von 'ls -d * /' zwei nachgestellte Schrägstriche ergibt , wie:
Dies liegt wahrscheinlich daran, dass Ihre Shell- oder Sitzungskonfigurationsdateien irgendwo den Befehl ls auf eine Version von ls aliasen, die das Flag -F enthält. Dieses Flag fügt jedem Ausgabenamen ein Zeichen hinzu (das ist keine einfache Datei), das angibt, um was es sich handelt. Ein Schrägstrich entspricht also dem Muster '* /', und der andere Schrägstrich ist der angehängte Typindikator.
Um dieses Problem zu beheben, können Sie natürlich einen anderen Alias für ls definieren. Um den Alias jedoch vorübergehend nicht aufzurufen, können Sie dem Befehl einen Backslash voranstellen:
\ ls -d * /
quelle
Ich füge dies einfach meiner
.bashrc
Datei hinzu (Sie können es auch einfach in die Befehlszeile eingeben, wenn Sie es nur für eine Sitzung benötigen / möchten).dann erzeugt lsd das gewünschte Ergebnis.
quelle
Aktuelle
ls
Lösung, einschließlich Symlinks zu VerzeichnissenViele Antworten hier verwenden sie nicht wirklich
ls
(oder verwenden sie nur im trivialen Sinnels -d
, während Platzhalter für den tatsächlichen Unterverzeichnisabgleich verwendet werden. Eine echtels
Lösung ist nützlich, da sie die Verwendung vonls
Optionen zum Sortieren der Reihenfolge usw. ermöglicht.Symlinks ausschließen
Es wurde eine Lösung
ls
angegeben, die sich jedoch von den anderen Lösungen dadurch unterscheidet, dass Symlinks zu Verzeichnissen ausgeschlossen werden:(möglicherweise Rohrleitungen durch
sed
oderawk
die Dateinamen diese isolieren)Einschließlich Symlinks
In dem (wahrscheinlich häufigeren) Fall, dass Symlinks zu Verzeichnissen enthalten sein sollten, können wir die
-p
Option von verwendenls
, wodurch ein Schrägstrich an die Namen von Verzeichnissen (einschließlich der mit Symlinks verknüpften) angehängt wird:oder die nachgestellten Schrägstriche loswerden:
Wir können nach
ls
Bedarf Optionen hinzufügen (wenn eine lange Liste verwendet wird,-1
ist diese nicht mehr erforderlich).Anmerkung: Wenn wir wollen , Schrägstriche Hinter, aber nicht will , sie hervorgehoben durch
grep
, können wir hackishly die Markierung entfernen , indem den tatsächlichen angepassten Teil der Linie leer zu machen:quelle
Wenn ein verstecktes Verzeichnis nicht aufgelistet werden muss, biete ich Folgendes an:
Und wenn versteckte Verzeichnisse aufgelistet werden müssen, verwenden Sie:
ODER
quelle
awk
möchten, schauen Sie sich bitte diese Antwort anOrdnerlisten ohne anzeigen
/
quelle
ls -d1 */ | tr -d "/"
set -- */; printf "%s\n" "${@%/}"
Hier ist was ich benutze
ls -d1 /Directory/Path/*;
quelle
ls -d1 /Directory/Path/*/
Zum Auflisten nur von Verzeichnissen :
zum Auflisten nur von Dateien :
oder Sie können auch Folgendes tun: ls -ld * /
quelle
Testen Sie, ob das Element ein Verzeichnis ist mit
test -d
:quelle
*/
ist ein Dateinamen-Übereinstimmungsmuster, das mit Verzeichnissen im aktuellen Verzeichnis übereinstimmt.Um nur Verzeichnisse aufzulisten, gefällt mir diese Funktion:
Legen Sie es in Ihre .bashrc.
Anwendungsbeispiele:
HINWEIS: Wenn Sie die
-i
Option verwenden, wird sie unterbrochen. Hier ist eine Lösung dafür:quelle
Zu Ihrer Information, wenn Sie alle Dateien mehrzeilig drucken möchten, können Sie eine
ls -1
ausführen, bei der jede Datei in einer separaten Zeile gedruckt wird. Datei1 Datei2 Datei3quelle
Eine einfache Liste des aktuellen Verzeichnisses wäre:
Möchten Sie es sortiert und sauber?
quelle
Probier diese. Es funktioniert für alle Linux-Distributionen.
quelle
ls -l | grep '^d' | awk '{print $9}'
Einzeiler, um Verzeichnisse nur von "hier" aufzulisten.
Mit Dateizahl.
quelle
Ich habe teilweise gelöst mit:
Nun, das reduziert sich auf mich, den Bürgermeister-Teil :)
quelle
Verwenden Sie eine Kombination aus Alberts Antwort und Gordans, die ziemlich nützlich sein sollte, um den Kreis zu schließen und den Pfad jedes Ordners abzurufen.
Ausgabe:
quelle
Verwenden von Perl:
quelle
Folgendes verwende ich, um nur Verzeichnisnamen aufzulisten:
quelle
Die ursprüngliche Frage zu beantworten,
*/
hat an sich nichts zu tunls
; Dies geschieht durch die Shell / Bash in einem als Globbing bezeichneten Prozess .Deshalb
echo */
undls -d */
geben Sie die gleichen Elemente aus. (Mit dem-d
Flagls
werden die Verzeichnisnamen und nicht der Inhalt der Verzeichnisse ausgegeben.)quelle
Hier ist eine Variation unter Verwendung eines Baums, der Verzeichnisnamen nur in separaten Zeilen ausgibt. Ja, es ist hässlich, aber hey, es funktioniert.
oder mit awk
Dies ist jedoch wahrscheinlich besser und behält den
/
Namen des Nachverzeichnisses bei.quelle
O / P (auf meiner Maschine) -
Die obige Ausgabe kann durch Schneiden weiter verfeinert werden.
quelle
Der kürzeste Befehl aller Zeiten (eigentlich ein Hack), um nur Verzeichnisse aufzulisten. Geben Sie den absoluten Pfad oder den relativen Pfad des gewünschten Verzeichnisses ein und drücken Sie die Eingabetaste, um das gewünschte Verzeichnis aufzurufen. Geben Sie nun
cd
die Tabulatortaste ein und drücken Sie sie . Jetzt werden nur die Verzeichnisse angezeigt.user@ubuntu:~/Desktop$cd <tab key>
Der obige Befehl sollte jetzt nur Ordner in Desktop anzeigen . In der Tat am kürzesten.
quelle