
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 -l
muestra cuál es el archivo y la carpeta con d
y -
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 find
el comando para buscar todos los archivos y ejecutarlos file
y du
los comandos para realizar nuestras ofertas a través de -exec
la bandera, pero eso se ve un poco feo (consulte el historial de edición). Sin embargo, podríamos usar find
el indicador ' -printf
para imprimir el tipo de archivo con %y
el 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í f
es para un archivo normal y d
para un directorio. Consulte find
el manual de para obtener más información sobre banderas y letras de tipo de archivo.
Respuesta2
Como dice Serg, du
no 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 du
puede hacerloeso. Entonces, usando eso, junto con sort
y 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 -0
a -z
y que utilice ASCII nul como separador.-0
du
sort
xargs
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 ls
imprimir 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: