![ls: Verzeichnisnamen anzeigen, wenn nur einer dem Muster entspricht](https://rvso.com/image/168781/ls%3A%20Verzeichnisnamen%20anzeigen%2C%20wenn%20nur%20einer%20dem%20Muster%20entspricht.png)
Bei ls
der Anzeige von Dateien, die einem Muster entsprechen, werden bei mehreren Übereinstimmungen die Verzeichnisnamen mit Inhalt angezeigt. Bei nur einer Übereinstimmung wird der Verzeichnisname weggelassen. Hier ein Beispiel:
example % ls
bar barbados foo
example % ls b*
bar:
1 2
barbados:
1 2
example % ls f*
1 2
Im Beispiel werden bei der Abfrage aller Dateien, die mit beginnen, b*
zwei Verzeichnisse gefunden, und die Ausgabe zeigt die Namen beider Verzeichnisse und deren Inhalte.
Wenn ich es anfordere, f*
zeigt die Ausgabe den Inhalt des einzelnen passenden Verzeichnisses an, lässt jedoch den Verzeichnisnamen aus.
Wie kann ich ls
die Anzeige des Namens des übereinstimmenden Verzeichnisses konfigurieren, wenn es nur mit einem einzigen Verzeichnis übereinstimmt?
Antwort1
Eine mögliche Problemumgehung könnte eine Wrapper-Funktion sein:
dls() {
if [ "$#" -eq 1 ] && [ -d "$1" ]; then
printf '%s:\n' "$1"
fi
ls -- "$@"
}
- Die obige Funktion akzeptiert keine Optionen als Argumente
- Es wird lediglich geprüft, ob:
- Es gibt nur ein einziges Argument
- Das Argument ist ein Verzeichnis
Wenn diese beiden Bedingungen erfüllt sind, drucken Sie den Namen des Verzeichnisses, bevor Sie seinen Inhalt auflisten.
% dls f*
foo:
1 2
Bei einigen printf
Implementierungen können Sie das %s
durch ersetzen %q
, um den Verzeichnisnamen in Anführungszeichen zu setzen, ähnlich wie es in neueren Versionen von GNU ls
der Fall ist, wenn dieser Leerzeichen oder andere Sonderzeichen enthält.
Antwort2
Wenn Sie in Ihren Beispielen ausführen, ls b*
erweitert die Shell das b*
in bar barbados
, sodass Sie tatsächlich ausführen ls bar barbados
. Wenn ls
mehrere Argumente vorhanden sind und eines davon ein Verzeichnis ist, wird der Name gefolgt von der Liste der Dateien im Verzeichnis gedruckt.
Wenn Sie ausführen ls f*
, erweitert die Shell das f*
in foo
, sodass Sie tatsächlich ausführen ls foo
. Wenn ls
ein einzelnes Argument vorhanden ist und dieses Argument ein Verzeichnis ist, wird die Liste der Dateien im Verzeichnis gedruckt (ohne den Verzeichnisnamen).
Es gibt keinen „guten“ Weg, um das zu erreichen, ls
was Sie wollen (zumindest keinen, den ich kenne, jemand anderes könnte es besser wissen). Ein „weniger als guter“ Weg wäre, ein zusätzliches Argument einzuschließen, von dem Sie wissen, dass es niemals existieren würde, und dann die Fehlerausgabe zu filtern, die sich auf diese nicht vorhandene Datei bezieht. Ich stelle fest, dass das Parsen der Ausgabe ls
keine gute Idee ist, aber ich gebe Ihnen Folgendes, falls es hilft:
$ function dls() {
if [[ $# -eq 0 ]]; then
ls
else
ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
fi
}
$ dls
foo
$ dls f*
foo:
1 2
Ein derartiges Vorgehen könnte unbeabsichtigte Folgen haben (beispielsweise könnten Sie Standardfehlermeldungen nicht wie gewohnt umleiten).
Antwort3
Verwenden Sie den -al
Parameter, den die meisten Leute immer verwenden. ls
Ich werde es dann nicht tun, bis Sie dem Verzeichnisnamen einen abschließenden Schrägstrich hinzufügen. Der andere Parameter ist -d
, dann wird es in keiner Weise absteigend sein.
Wenn Sie es dauerhaft möchten, fügen Sie Folgendes .bashrc
in Ihr Home-Verzeichnis ein:
alias lsd='ls -d' ;
lsd
Sie können den Befehl in Zukunft verwenden .