¿Cómo obtengo el tamaño real del directorio, usando las herramientas estándar de UNIX / Linux?
Alternativa pregunta: ¿Cómo llego du mostrarme el tamaño del directorio actual (no el uso del disco)?
Dado que las personas parecen tener diferentes definiciones del término "tamaño": Mi definición de "tamaño de directorio" es la suma de todos los archivos regulares dentro de ese directorio.
NO me importa el tamaño del inodo del directorio o lo que sea (bloques * tamaño de bloque) que los archivos ocupan en el sistema de archivos respectivo. Un directorio con 3 archivos, 1 byte cada uno, tiene un tamaño de directorio de 3 bytes (según mi definición).
Calcular el tamaño del directorio usando du parece no ser confiable.
Por ejemplo, mkdir foo && du -b foo
informa "4096 foo", 4096 bytes en lugar de 0 bytes. Con directorios muy grandes, el tamaño de directorio informado por du -hs
puede ser de 100 GB (!) Y más (sistema de archivos comprimido).
Entonces, ¿qué (herramienta / opción) debe usarse para obtener el tamaño real del directorio?
xfs
por casualidad?Respuestas:
Aquí hay un script que muestra un tamaño de directorio legible por humanos usando las herramientas estándar de Unix (POSIX).
p.ej:
fuente
ls
invocaciones aquí:-q
. Sin esta opción, el script se romperá si algún nombre de archivo contiene caracteres de nueva línea. Escribir scripts de shell realmente confiables es demasiado difícil ...Algunas versiones de
du
soportan el argumento--apparent-size
para mostrar el tamaño aparente en lugar del uso del disco. Entonces su comando sería:Desde las páginas man para du incluidas con Ubuntu 12.04 LTS:
fuente
Solo una alternativa, usando
ls
:ls -nR
: me-n
gusta-l
, pero enumere UID y GID numéricos y-R
enumere subdirectorios de forma recursiva.grep -v:
Invierta el sentido de coincidencia para seleccionar líneas no coincidentes. (-v es especificado por POSIX).'^ d'
excluirá los directorios.Comando Ls: http://linux.about.com/od/commands/l/blcmdl1_ls.htm
Hombre Grep: http://linux.die.net/man/1/grep
EDITAR :
Editado como la sugerencia @ Sergey Vlasov.
fuente
-n
opción para enls
lugar de-l
(mostrar números UID / GID en lugar de nombres) es más seguro, porque los nombres de usuarios y grupos pueden contener espacios (por ejemplo, si se usawinbind
osssd
se usa para unir el sistema a un dominio de Windows, puede obtener nombres de grupo comodomain users
) . También debería ser más rápido debido a que no es necesario buscar nombres de usuarios y grupos.Suponiendo que tiene un
du
núcleo de GNU, este comando debe calcular el tamaño aparente total del número arbitrario de archivos regulares dentro de un directorio sin ningún límite arbitrario en el número de archivos:Agregue la
-l
opcióndu
si hay algunos archivos enlazados en el interior y desea contar cada enlace por separado (de forma predeterminada,du
cuenta con múltiples enlaces duros solo una vez).La diferencia más importante con plain
du -sb
es que recursivodu
también cuenta los tamaños de los directorios, que los diferentes sistemas de archivos informan de manera diferente; para evitar esto, elfind
comando se usa para pasar solo archivos regulares adu
. Otra diferencia es que los enlaces simbólicos se ignoran (si se deben contar, sefind
debe ajustar el comando).Este comando también consumirá más memoria que la simple
du -sb
, porque usar el dispositivo de almacenamiento de--files0-from=FILE
marcasdu
y los números de inodo de todos los archivos procesados, en oposición al comportamiento predeterminado de recordar solo archivos con más de un enlace duro. (Esto no es un problema si la-l
opción se usa para contar los enlaces duros varias veces, porque la única razón para almacenar los números de dispositivo e inodo es omitir los archivos enlazados que ya se han procesado).Si desea obtener una representación del tamaño total legible por humanos, simplemente agregue la
-h
opción (esto funciona porquedu
se invoca solo una vez y calcula el tamaño total en sí, a diferencia de otras respuestas sugeridas):o (si le preocupa que algunos de los efectos
-b
sean anulados-h
)fuente
-b
probablemente no se pueda reemplazar por-A -B 1
, no hay un equivalente para ello--files0-from=-
, y el usoxargs
necesitará algunas soluciones en caso de que la lista de archivos sea mayor queARG_MAX
(y alguna solución externa para resultados legibles por humanos).Si todo lo que desea es el tamaño de los archivos, excluyendo el espacio que ocupan los directorios, puede hacer algo como
@SergeyVlasov señaló que esto fallará si tiene más archivos que
argmax
. Para evitar eso, puede usar algo como:fuente
xargs
invocarádu
varias veces, y cada invocación imprimirá el total general solo por su parte de la lista completa de archivos, luegotail
mostrará solo el tamaño total de la última parte.