comando du: ¿mostrar archivo o carpeta en la salida?

comando du: ¿mostrar archivo o carpeta en la salida?

Si ejecuto el comando, du -ah | sort -nr¿es posible hacer que muestre qué línea del resultado es un archivo y qué carpeta? Algo así como el comando ls -lmuestra cuál es el archivo y la carpeta con dy -al frente.

Respuesta1

Es algo posible, pero no sin la ayuda de otro comando. Específicamente, aquí estamos usando GNU awk (eso es importante, así que verifique su versión de awk)

$ du -ah | sort -nr | awk '{usage=$1; $1="";cmd="file "$0;cmd |& getline type;print usage,type ;close(cmd)}'             
24K .: directory
4.0K ./testdir: directory
4.0K ./out.txt: ASCII text
4.0K ./3.txt: ASCII text
4.0K ./2.txt: ASCII text
4.0K ./1.txt: ASCII text

Por supuesto, este enfoque tiene algunos fallos ya que parece fallar con nombres de archivos que contienen espacios (aún estoy trabajando para mejorarlo).

Como alternativa, también podemos usar findel comando para buscar todos los archivos y ejecutarlos filey dulos comandos para realizar nuestras ofertas a través de -execla bandera, pero eso se ve un poco feo (consulte el historial de edición). Sin embargo, podríamos usar findel indicador ' -printfpara imprimir el tipo de archivo con %yel formato para obtener un resultado mucho más bonito.

$ find -mindepth 1 -printf "%y\t" -exec  du "{}" \;  | sort -rn                                       
f   4   ./out.txt
f   4   ./3.txt
f   4   ./2.txt
f   4   ./1.txt
f   0   ./with space.txt
d   4   ./testdir

Obviamente aquí fes para un archivo normal y dpara un directorio. Consulte findel manual de para obtener más información sobre banderas y letras de tipo de archivo.

Respuesta2

Como dice Serg, duno puede hacerlo por sí solo. Para procesar nombres de archivos de forma segura, la mejor manera es separarlos con el carácter nulo ASCII ( \0), y dupuede hacerloeso. Entonces, usando eso, junto con sorty xargs' la capacidad de manejar entradas delimitadas por nulos:

du -0ah |
  sort -zh |
  xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _

Las opciones y le indican -0a -zy que utilice ASCII nul como separador.-0dusortxargs

Luego, s=${i%[[:space:]]*}para obtener el inicio de la línea hasta el espacio en blanco (que es el tamaño) y f=${i#*[[:space:]]}obtener todo lo demás (el nombre del archivo). Luego podemos lsimprimir el nombre del archivo con decoración.

Ejemplo:

$ du -0ah Screenshots | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
512 Screenshots/desktop.ini*
264K Screenshots/Screenshot (1).png*
269K Screenshots/

Debido a que usé ls --color, también obtengo una buena salida en color:

ingrese la descripción de la imagen aquí

información relacionada