Obtener tamaño solo con du de archivos

51

¿Cómo puedo obtener el tamaño de todos los archivos y todos los archivos en sus subdirectorios usando el comando du?

Estoy intentando el siguiente comando para obtener el tamaño de todos los archivos (y archivos en subdirectorios)

find . -type f | du -a

Pero esto también imprime los tamaños de carpeta. ¿Cómo puedo obtener una lista de tamaños de todos los archivos y archivos en subdirectorios? También probé el, exec flagpero no estoy seguro de cómo canalizar la salida a otro comando después de que ejecute los resultados de findinto du.

El sistema operativo es AIX 6.1 con ksh shell.

Shardul Upadhyay
fuente

Respuestas:

57

Usualmente uso la -executilidad. Me gusta esto:

find . -type f -exec du -a {} +

Lo probé tanto en bash como en ksh con GNU find. Nunca probé AIX, pero estoy seguro de que su versión de find tiene alguna -execsintaxis.

El siguiente fragmento ordena la lista, la más grande primero:

find . -type f -exec du -a {} + | sort -n -r | less
rahmu
fuente
3
Me gustaría ir con esta respuesta si no tienes acceso find -print0u otras funciones de GNU. Si está disponible, reemplazar \;con \+dará como resultado menos invocaciones duy, por lo tanto, un mejor rendimiento.
jw013
Gracias, esto funciona muy bien, especialmente porque du ofrece una bandera de tamaño en diferentes unidades.
Shardul Upadhyay
No pude encontrar información sobre la +opción. ¿Es esa una opción para duo para find? ¿Y por qué resulta en menos llamadas?
Amelio Vazquez-Reina
1
Es una opción estándar de find. Especifica execel comando (en nuestro caso du) solo una vez, con todos los resultados finddados como argumentos sucesivos del comando.
rahmu
wtf, ¿por qué no hay un comando comodu -f --threshold=1G
Alexander Mills
16

Si tiene utilidades GNU, intente

find . -type f -print0 | du --files0-from=-
jw013
fuente
El comando falla diciendo que print0 no es un comando válido y que el último signo negativo no era un indicador reconocido. No creo que este enfoque funcione porque man duno incluye una fileso una frombandera.
Shardul Upadhyay
Debe agregar su sistema operativo como etiqueta a la pregunta. Asumí que tenías GNU pero olvidé mencionar eso.
jw013
1
¡Ten un voto positivo sobre mí! Su solución particular funciona du -chpara obtener un gran total de archivos coincidentes:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
Michael Goldshteyn
9

Generalmente uso:

find . -type f -print0 | xargs -r0 du -a

Xargs generalmente llama al comando, incluso si no se pasan argumentos; xargs du </dev/nullaún se llamará, xargs -r du </dev/nullno llamará du. El -0argumento busca cadenas terminadas en nulo en lugar de nuevas terminadas en línea.

Luego, generalmente agrego | awk '{sum+=$1} END {print sum}'al final para obtener el total.

Arcege
fuente
2
El then I usually addvalor del oro :-)
Radek
2

Aquí hay una versión con nombres largos de parámetros y clasificación humana.

find . -type f -exec du --human {} + | sort --human --reverse | head

Tampoco vi la necesidad de -a/--allser pasado a du.

Tarrasch
fuente
-2

archivos específicos en el directorio actual

du -ch files*

es más corto y me funciona

du -sh .

para el directorio actual y todos los archivos en sub

du (GNU coreutils) 8.30

retaco
fuente
1
(1) ¿Qué quieres decir con du -ch files*? Supongamos que el directorio actual contiene ant, apple, banana, bat, cat, corn, date, y dog, donde los nombres de los animales son los subdirectorios y los nombres de vegetales / frutas son archivos - lo comando usaría para obtener sólo los archivos? ¿O no es eso lo que querías decir? (2)  du -sh .informará solo un gran total de todo en y bajo el directorio actual, y no los archivos en sí mismos. Esto es más o menos exactamente lo opuesto a la pregunta que se hizo.
G-Man dice 'reinstalar a Monica' el