ls: Verzeichnisnamen anzeigen, wenn nur einer dem Muster entspricht

ls: Verzeichnisnamen anzeigen, wenn nur einer dem Muster entspricht

Bei lsder 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 lsdie 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:
    1. Es gibt nur ein einziges Argument
    2. 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 printfImplementierungen können Sie das %sdurch ersetzen %q, um den Verzeichnisnamen in Anführungszeichen zu setzen, ähnlich wie es in neueren Versionen von GNU lsder 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 lsmehrere 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 lsein 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, lswas 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 lskeine 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 -alParameter, den die meisten Leute immer verwenden. lsIch 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 .bashrcin Ihr Home-Verzeichnis ein:

alias lsd='ls -d' ;

lsdSie können den Befehl in Zukunft verwenden .

verwandte Informationen