Ich glaube nicht, dass Sie jedes verfügbare Feature zuverlässig (falsch) verwenden können, um regelmäßig ls
(mit oder ohne Optionen) das zu tun, was Sie möchten. Sie müssen ls
mit einem Skript, einer Funktion oder einem Alias neu definieren.
Ich würde mich jedoch nicht neu definieren ls
, zumindest nicht in diesem Beispiel, das ein simpler Proof of Concept sein soll . Die Unterstützung von Befehlszeilenschaltern von ls
würde das Beispiel zu komplex machen.
Um meine Lösung zu implementieren, benötigen Sie ein Dateisystem, das erweiterte Attribute und Werkzeuge zur Manipulation unterstützt (z apt-get install attr
. B. in Debian).
So legen Sie das Attribut fest:
setfattr -n user.mytag -v "hello.c" "8C8C190C-5340-421C-96D1-D4111C5E062C"
Hinweis: mytag
ist ein beliebiger Name. Wählen Sie eine aus und bleiben Sie dabei.
So entfernen Sie das Attribut:
setfattr -x user.mytag "8C8C190C-5340-421C-96D1-D4111C5E062C"
Sie können benutzerdefinierte Skripts oder Funktionen erstellen, um diese Aufgaben auf bequemere Weise auszuführen. Nehmen wir an, Sie entscheiden ll
, was Sie wollen. Wenn es sich um einen Alias handelt, müssen Sie ihn zunächst unaliasieren:
unalias ll
Dann definieren Sie eine Funktion:
function ll() { find "$@" -maxdepth 1 -exec \ sh -c ' a=$(getfattr -n user.mytag --only-values "$1" 2>/dev/null) ls -dalF -- "$1" | tr -d "\n" if [ -z "$a" ]; then printf "\n"; else printf " => %s\n" "$a"; fi ' sh {} \; }
Anwendungsbeispiele:
ll # but see notes below ll 8C8C190C-5340-421C-96D1-D4111C5E062C ll /bin ll foo.txt bar.txt
Beispielausgabe:
-rw------- 1 root root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C => hello.c
Anmerkungen:
- Ich habe es
=>
nicht verwendet->
, weil letzteres bereits vonls
Symlinks verwendet wird. - POSIX erfordert mindestens einen Pfad beim
find
Aufruf. Alleinell
(ohne Argumente) kannfind
zum Scheitern führen (vergleiche diese Antwort ). Wenn ja, müssen Sie einige vorläufige Logik passieren.
zufind
. -maxdepth
ist auch nicht POSIX. Falls Sie es nicht verwenden können, sehen Sie diese Frage .- Die Funktion übergibt einfach alle ihre Argumente an
find
(as"$@"
). Dies bedeutet, dass dieser Benutzerll
die vonls
(oder allgemeinerll
Aliasname) normalerweise verwendeten Optionen nicht versteht . Andererseits ist das Einspritzen von Testsfind
möglich. - Sonderzeichen oder nicht druckbare Zeichen in Namen oder Tags können zu einer unerwarteten Ausgabe führen.
ls -dalF
wird für jedes Objekt separat aufgerufen, sodass die resultierenden Zeilen möglicherweise nicht in regulären Spalten ausgerichtet werden. Erwägen Sie eine-printf
Aktion, anstattls
alle Informationen auszudrucken, die Sie benötigen, außer dem Tag, der noch benötigt wirdgetfattr
. Wenn Sie tab als Trennzeichen im-printf
Format verwenden, wird eine mehrzeilige Ausgabe in Spaltenform gebracht (zumindest in gewisser Weise). Beachten Sie, dass Sie mit dem richtigen-printf
Format nicht benötigentr
.