Warum funktioniert dieser Platzhalter nicht so, wie ich es erwartet habe?

11

In meinem Benutzerordner befinden sich Ordner wie D ropbox, D ocuments, D ownloads & d ump.

ls a*sollte alle Dateien auflisten, deren Name mit beginnt a. Richtig? Aber wenn ich den Befehl gebe ls d*, dumpwird mir nicht nur angezeigt, sondern auch das ls des Dump-Verzeichnisses. Und wenn ich den Befehl als gebe ls D*, zeigt er ls aller Falten an, beginnend mit D.

Welchen Teil habe ich vermisst, um es zu verstehen?

Bearbeiten: Screenshot anhängen ls Screenshot

Ashfame
quelle

Antworten:

17

Laut Bash-Manpage:

bash durchsucht jedes Wort nach den Zeichen *,? und [. Wenn eines dieser Zeichen angezeigt wird, wird das Wort als Muster betrachtet und durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, die dem Muster entsprechen

und vom Info-Knoten für ls

Das Programm "ls" listet Informationen zu Dateien (jeglichen Typs, einschließlich Verzeichnissen) auf. Optionen und Dateiargumente können wie gewohnt beliebig gemischt werden.

Bei Befehlszeilenargumenten ohne Option, bei denen es sich um Verzeichnisse handelt, listet 'ls' standardmäßig den Inhalt von Verzeichnissen nicht rekursiv auf und lässt Dateien mit Namen weg, die mit '.' Beginnen. Bei anderen Argumenten ohne Option listet "ls" standardmäßig nur den Dateinamen auf. Wenn keine Argumente ohne Option angegeben sind, listet 'ls' den Inhalt des aktuellen Verzeichnisses auf.

Wenn Sie also geben ls d*, wird d * zu einer sortierten Liste aller Datei- / Verzeichnisnamen erweitert, die mit d beginnen. So wird Ihr Befehl

ls dump

und da dump ein Verzeichnisname ist, erhalten Sie die Liste aller Dateien im Verzeichnis "dump". Wenn Sie jedoch angeben ls D*, wird D * zu " Dropbox für Desktop-Dokumente herunterladen " erweitert, sodass der Befehl lautet

ls Desktop Documents Downloads Dropbox

und da dies alles Verzeichnisse sind, erhalten Sie die Liste der Dateien in einzelnen Verzeichnissen. Wenn es eine Datei gegeben hätte, die mit D im aktuellen Verzeichnis beginnt , wäre sie separat aufgeführt worden.

binW
quelle
2
Ein kleiner Zusatz: Wenn mehr als ein Verzeichnis als Argument angegeben wird, zeigt ls den Namen jedes Verzeichnisses an, bevor dessen Inhalt aufgelistet wird. Es wird nicht für ein einzelnes Verzeichnis ausgeführt.
Marcel Stimberg
Vielen Dank! Das hat meine Zweifel ausgeräumt. Ich habe eine gemacht ls p*und es wurde eine Datei angezeigt, weil sie existiert und eine ls P*zeigt den öffentlichen Ordner " Bilder ", da keine Datei mit P beginnt . Und als ich ein Verzeichnis namens poo erstellt habe , wurde es amls p*
Ashfame
7

ls d * und D * listen beide Dateien und Ordner auf, die mit d * bzw. D * übereinstimmen. Das Verhalten ist das gleiche. Bei Ihrem Test muss ein Fehler aufgetreten sein.

Wenn Sie nur die Ordnernamen und nicht den Ordnerinhalt auflisten möchten, müssen Sie "-d" verwenden:

ls -d D*
João Pinto
quelle
Ich habe einen Screenshot angehängt, bitte werfen Sie einen Blick
Ashfame
0

Wie oben vorgeschlagen, ist die -dOption der richtige Weg. Hinzufügen

alias ld='ls -d'

zu meiner ~/.bashrcDatei funktioniert gut für mich.

user3179473
quelle
3
Mit diesem Alias ​​blockieren Sie den einfachen Zugriff auf ld - The GNU linker, wodurch das OP keine Programme kompilieren und verknüpfen kann. Verwenden Sie alias lsd='ls -d'stattdessen. Bevor Aliasing etwas wie footun immer type foozu sehen , ob foobereits als Name für etwas verwendet wird, und entscheiden , ob die Bequemlichkeit der Alias - Überschreibung des Verlust des Zugangs zum vorherigenfoo
waltinator