forma sencilla de describir/etiquetar archivos en bash

forma sencilla de describir/etiquetar archivos en bash

¿Existe una forma rápida y sencilla de etiquetar archivos en bash para que una lista como esta?

-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

se convierte en algo como esto (o similar)

-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

Intenté hacer algo ln -spero termino con muchos duplicados porque los enlaces están en el mismo directorio y para obtener una buena vista debo filtrar ls con grep... cualquier ayuda se agradece.

Respuesta1

No creo que puedas usar (mal) de manera confiable ninguna función disponible para hacer lslo que quieras con regularidad (con o sin opciones). Necesita redefinir lscon un script, una función o un alias.

Sin embargo, no lo redefiniría ls, al menos no en este ejemplo, que pretende seruna simple prueba de concepto. Admitir cambios en la línea de comando lsharía que el ejemplo fuera demasiado complejo.

Para implementar mi solución necesita un sistema de archivos que admita atributos extendidos y herramientas para manipularlos (por ejemplo, apt-get install attren Debian).

Para establecer el atributo:

setfattr -n user.mytag -v "hello.c" "8C8C190C-5340-421C-96D1-D4111C5E062C"

Nota: mytages un nombre arbitrario. Elige uno y apégate a él.

Para eliminar el atributo:

setfattr -x user.mytag "8C8C190C-5340-421C-96D1-D4111C5E062C"

Puede crear scripts o funciones personalizados para hacer estas cosas de una manera más conveniente. Ahora digamos que eliges llhacer lo que quieres. Si es un alias, primero debes quitarle el alias:

unalias ll

Luego define una función:

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 {} \;
}

Ejemplos de uso:

ll   # but see notes below
ll 8C8C190C-5340-421C-96D1-D4111C5E062C
ll /bin
ll foo.txt bar.txt

Salida de ejemplo:

-rw------- 1 root root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C => hello.c

Notas:

  • Usé =>, no ->, porque este último ya lo usa lspara enlaces simbólicos.
  • POSIX requiere al menos una ruta en findla invocación. Único ll(sin argumentos) puede hacer findque falle (compáreseesta respuesta). Si es así, necesitará alguna lógica preliminar para pasar .a find.
  • -maxdepthtampoco es POSIX. En caso de que no puedas usarlo, consultaesta pregunta.
  • La función simplemente pasa todos sus argumentos a find(como "$@"). Esto significa que esta costumbre llno comprende las opciones utilizadas normalmente por ls(o llalias comunes). Por otro lado, findes posible inyectar pruebas.
  • Los caracteres especiales o no imprimibles en nombres o etiquetas pueden provocar resultados inesperados.
  • ls -dalFse llama para cada objeto por separado, por lo que es posible que las líneas resultantes no se alineen en columnas regulares. Considere -printfla posibilidad de actuar en lugar de lsimprimir toda la información que necesita, excepto la etiqueta que aún necesitará getfattr. El uso de tabulaciones como separador en -printfel formato creará columnas en una salida de varias líneas (al menos hasta cierto punto). Tenga en cuenta que con el formato adecuado -printfno necesitará tr.

información relacionada