einfache beschreibung / tagging von dateien in bash

530
Edoardo

Gibt es eine schnelle und einfache Möglichkeit, Dateien in bash so zu kennzeichnen, dass eine Liste wie diese angezeigt wird

-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 ähnlich (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 mit zu tun, ln -saber am Ende habe ich viele Duplikate, da sich die Links im selben Verzeichnis befinden und um eine schöne Ansicht zu erhalten, muss ich ls mit grep filtern

0
Möchten Sie "attr", dh erweiterte Attribute? choroba vor 6 Jahren 0
Ist das eine Ausgabe von 'ls'? Es scheint, dass Sie die '-L`-Option verwenden (zusammen mit einer anderen, um die Gruppe oder den Eigentümer auszublenden). Versuchen Sie `/ bin / ls -l` Paulo vor 6 Jahren 0
Ja, das sind Ausgaben eines `ll'-Alias, der derzeit als 'ls -alF' definiert ist. Ich interessiere mich nicht für Eigentümer und / oder Attribute Edoardo vor 6 Jahren 0

1 Antwort auf die Frage

1
Kamil Maciorowski

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 lsmit 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 lswü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: mytagist 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 von lsSymlinks verwendet wird.
  • POSIX erfordert mindestens einen Pfad beim findAufruf. Alleine ll(ohne Argumente) kann findzum Scheitern führen (vergleiche diese Antwort ). Wenn ja, müssen Sie einige vorläufige Logik passieren .zu find.
  • -maxdepthist 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 Benutzer lldie von ls(oder allgemeiner llAliasname) normalerweise verwendeten Optionen nicht versteht . Andererseits ist das Einspritzen von Tests findmöglich.
  • Sonderzeichen oder nicht druckbare Zeichen in Namen oder Tags können zu einer unerwarteten Ausgabe führen.
  • ls -dalFwird für jedes Objekt separat aufgerufen, sodass die resultierenden Zeilen möglicherweise nicht in regulären Spalten ausgerichtet werden. Erwägen Sie eine -printfAktion, anstatt lsalle Informationen auszudrucken, die Sie benötigen, außer dem Tag, der noch benötigt wird getfattr. Wenn Sie tab als Trennzeichen im -printfFormat verwenden, wird eine mehrzeilige Ausgabe in Spaltenform gebracht (zumindest in gewisser Weise). Beachten Sie, dass Sie mit dem richtigen -printfFormat nicht benötigen tr.