
Ich habe Mühe zu verstehen, wie ls -d funktioniert. Ich habe die anderen ls -d-Fragen durchgelesen, aber keine davon fragt, warum es ls -d *
nicht genauso funktioniert wie ls -d */
. Warum ist das Trennzeichen am Ende so wichtig?
ls *
und ls */
sich gleich verhalten, also habe ich erwartet, ls -d *
dass ls -d */
sie auch gleich funktionieren.
Stattdessen
ls -d *
werden alle Dateien im aktuellen Verzeichnis aufgelistet, genau wie bei ls
, wobei ls -d */
das Verzeichnis im aktuellen Verzeichnis aufgelistet wird. Warum ist das so?
Antwort1
ls *
undls */
sich genauso verhalten.
Nein, das tun sie nicht. Wenn Sie Dateien in Ihrem Arbeitsverzeichnis haben, werden diese mit dem ersten Befehl aufgelistet, mit dem zweiten jedoch nicht.
ls
listet die Dateien und Verzeichnisse (einschließlich deren Inhalt) auf, die auf der Kommandozeile übergeben wurden. Wenn Sie Shell-Globbing verwenden, ersetzt Ihre Shell dieMuster"mit einer alphabetisch sortierten Liste von Dateinamen" (vgl.Dateinamenerweiterung).
Das Muster *
stimmt mit jeder Datei und jedem Verzeichnis im aktuellen Verzeichnis überein (ausgenommen versteckte Dateien, die mit beginnen .
), während */
nur mit Verzeichnissen übereinstimmt (ausgenommen versteckte Verzeichnisse).
Der Schalter -d
deaktiviert die Inhaltsauflistung für Verzeichnisse, aber an ls übergebene Dateien werden weiterhin aufgelistet.
Antwort2
Die Antwort lautet: Die Endung /
zwingt ls, nur Verzeichnisse durchzusehen.
Bitte beachten Sie, dass das Verhalten konsistent ist (mit und ohne -d
).
Ein kleiner Test:
mkdir /tmp/test
touch /tmp/test/a
mkdir /tmp/test/b
touch /tmp/test/b/c
cd /tmp/test
Und dann tun Sie es ls *
und ls */
Sie werden den Unterschied bemerken.