Gibt es eine schnelle und einfache Möglichkeit, Dateien in Bash zu markieren, sodass eine Liste wie diese
-rw------- 1 root 88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root 248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990
-rw------- 1 root 293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root 120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC
-rw------- 1 root 20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C
-rw------- 1 root 1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C
wird so etwas (oder ähnlich)
-rw------- 1 root 88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root 248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990 -> MYOLDFILE1
-rw------- 1 root 293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root 120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC -> MYNEWFILE.TXT
-rw------- 1 root 20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C -> hello.c
-rw------- 1 root 1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C
Ich habe versucht, etwas damit zu machen, ln -s
aber dann habe ich am Ende viele Duplikate, weil die Links im selben Verzeichnis sind und um eine schöne Ansicht zu bekommen, muss ich ls mit grep filtern.. jede Hilfe ist willkommen
Antwort1
Ich glaube nicht, dass Sie eine verfügbare Funktion zuverlässig (missbrauchen) können, um normale ls
Funktionen (mit oder ohne Optionen) dazu zu bringen, das zu tun, was Sie wollen. Sie müssen sie ls
mit einem Skript, einer Funktion oder einem Alias neu definieren.
Ich würde ls
mich jedoch nicht neu definieren, zumindest nicht in diesem Beispiel, dasein einfacher Proof of Concept. Die Unterstützung von Befehlszeilenschaltern ls
würde das Beispiel übermäßig komplex machen.
Um meine Lösung zu implementieren, benötigen Sie ein Dateisystem, das erweiterte Attribute unterstützt, und Tools, um diese zu bearbeiten (z. B. apt-get install attr
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 einen aus und bleiben Sie dabei.
So entfernen Sie das Attribut:
setfattr -x user.mytag "8C8C190C-5340-421C-96D1-D4111C5E062C"
Sie können benutzerdefinierte Skripte oder Funktionen erstellen, um diese Dinge bequemer zu erledigen. Nehmen wir nun an, Sie möchten ll
tun, was Sie möchten. Wenn es sich um einen Alias handelt, müssen Sie ihn zuerst aufheben:
unalias ll
Definieren Sie dann 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 verwendet
=>
, nicht->
, da letzteres bereits vonls
für symbolische Links verwendet wird. - POSIX erfordert mindestens einen Pfad im
find
Aufruf. Solell
(ohne Argumente) kannfind
zum Scheitern führen (vgl.diese Antwort). Wenn ja, benötigen Sie eine vorläufige Logik, die Sie.
an weitergeben könnenfind
. -maxdepth
ist auch nicht POSIX. Falls Sie es nicht verwenden können, siehediese Frage.- Die Funktion übergibt einfach alle ihre Argumente an
find
(als"$@"
). Das bedeutet, dass diese benutzerdefinierte Funktion die normalerweise von (oder den üblichen Alias)ll
verwendeten Optionen nicht versteht . Andererseits ist das Einfügen von Tests in möglich.ls
ll
find
- Sonderzeichen oder nicht druckbare Zeichen in Namen oder Tags können zu unerwarteten Ausgaben führen.
ls -dalF
wird für jedes Objekt einzeln aufgerufen, daher werden die resultierenden Zeilen möglicherweise nicht in regulären Spalten angezeigt. Erwägen Sie-printf
die Aktion anstelle von ,ls
um alle benötigten Informationen auszudrucken, mit Ausnahme des Tags, für das weiterhin erforderlich istgetfattr
. Wenn Sie in der Formatierung Tabulatoren als Trennzeichen verwenden,-printf
wird eine mehrzeilige Ausgabe (zumindest bis zu einem gewissen Grad) in Spalten aufgeteilt. Beachten Sie, dass-printf
Sie bei der richtigen Formatierung kein benötigentr
.