¿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 -s
pero 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 ls
lo que quieras con regularidad (con o sin opciones). Necesita redefinir ls
con 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 ls
harí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 attr
en Debian).
Para establecer el atributo:
setfattr -n user.mytag -v "hello.c" "8C8C190C-5340-421C-96D1-D4111C5E062C"
Nota: mytag
es 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 ll
hacer 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 usals
para enlaces simbólicos. - POSIX requiere al menos una ruta en
find
la invocación. Únicoll
(sin argumentos) puede hacerfind
que falle (compáreseesta respuesta). Si es así, necesitará alguna lógica preliminar para pasar.
afind
. -maxdepth
tampoco 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 costumbrell
no comprende las opciones utilizadas normalmente porls
(oll
alias comunes). Por otro lado,find
es posible inyectar pruebas. - Los caracteres especiales o no imprimibles en nombres o etiquetas pueden provocar resultados inesperados.
ls -dalF
se llama para cada objeto por separado, por lo que es posible que las líneas resultantes no se alineen en columnas regulares. Considere-printf
la posibilidad de actuar en lugar dels
imprimir toda la información que necesita, excepto la etiqueta que aún necesitarágetfattr
. El uso de tabulaciones como separador en-printf
el formato creará columnas en una salida de varias líneas (al menos hasta cierto punto). Tenga en cuenta que con el formato adecuado-printf
no necesitarátr
.