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.

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

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=-

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.


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.


-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.