Alias de Bash para LS que imprime múltiples columnas por "Escriba"
Pregunta
Estoy enumerando solo los archivos Basenames con un comando LS como este, del que obtuve aquí:
ls --color -1 . | tr '\n' '\0' | xargs -0 -n 1 basename
Me gustaría enumerar todos los directorios en la primera columna, todos los ejecutables de la siguiente, todos los archivos regulares duran (tal vez también con una columna para cada extensión).
Entonces, el primer "desafío" (y principal) es imprimir múltiples columnas de diferentes longitudes.
¿Tiene alguna sugerencia qué comandos debería usar para escribir ese script? ¿Debo cambiar a find
? ¿O debería escribir el script todo en Perl?
Quiero poder ordenar opcionalmente las columnas por tamaño también ;-) No necesariamente estoy buscando un script para hacer lo anterior, pero tal vez algunos consejos sobre las formas de abordar la redacción de dicho script.
Solución
#!/bin/bash
width=20
awk -F':' '
/directory/{
d[i++]=$1
next
}
/executable/{
e[j++]=$1
next
}
{
f[k++]=$1
}
END{
a[1]=i;a[2]=j;a[3]=k
asort(a)
printf("%-*.*s | \t%-*.*s | \t%-*.*s\n", w,w,"Directories", w,w,"Executables", w,w,"Files")
print "------------------------------------------------------------------------"
for (i=0;i<a[3];i++)
printf("%-*.*s |\t%-*.*s |\t%-*.*s\n", w,w,d[i], w,w,e[i], w,w,f[i])
}' w=$width < <(find . -exec file {} +)
Salida de muestra AQUÍ
Esto se puede mejorar aún más calculando cuál es la entrada más larga por columna y usar eso como ancho. Dejaré eso como un ejercicio para el lector