einfache Möglichkeit zum Beschreiben/Markieren von Dateien in Bash

einfache Möglichkeit zum Beschreiben/Markieren von Dateien in Bash

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 -saber 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 lsFunktionen (mit oder ohne Optionen) dazu zu bringen, das zu tun, was Sie wollen. Sie müssen sie lsmit einem Skript, einer Funktion oder einem Alias ​​neu definieren.

Ich würde lsmich jedoch nicht neu definieren, zumindest nicht in diesem Beispiel, dasein einfacher Proof of Concept. Die Unterstützung von Befehlszeilenschaltern lswü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 attrin 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 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 lltun, 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 von lsfür symbolische Links verwendet wird.
  • POSIX erfordert mindestens einen Pfad im findAufruf. Sole ll(ohne Argumente) kann findzum Scheitern führen (vgl.diese Antwort). Wenn ja, benötigen Sie eine vorläufige Logik, die Sie .an weitergeben können find.
  • -maxdepthist 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) llverwendeten Optionen nicht versteht . Andererseits ist das Einfügen von Tests in möglich.lsllfind
  • Sonderzeichen oder nicht druckbare Zeichen in Namen oder Tags können zu unerwarteten Ausgaben führen.
  • ls -dalFwird für jedes Objekt einzeln aufgerufen, daher werden die resultierenden Zeilen möglicherweise nicht in regulären Spalten angezeigt. Erwägen Sie -printfdie Aktion anstelle von , lsum alle benötigten Informationen auszudrucken, mit Ausnahme des Tags, für das weiterhin erforderlich ist getfattr. Wenn Sie in der Formatierung Tabulatoren als Trennzeichen verwenden, -printfwird eine mehrzeilige Ausgabe (zumindest bis zu einem gewissen Grad) in Spalten aufgeteilt. Beachten Sie, dass -printfSie bei der richtigen Formatierung kein benötigen tr.

verwandte Informationen