Diferencia de cálculo de tamaño de directorio


9

Necesito obtener el tamaño del directorio en la terminal para firmar. Estoy usando el siguiente comando:

du -s /path/to/dir

Estoy multiplicando el resultado por el tamaño de bloque UNIX tradicional (512 bytes) y obtengo el tamaño real del directorio en bytes. Sin embargo, la ventana de diálogo "Obtener información" del Finder muestra el tamaño ligeramente más pequeño que el calculado con el comando de terminal. Y parece que es reproducible en cualquier carpeta / paquete. ¿Qué me estoy perdiendo?

Respuestas:


11

Normalmente, dumuestra información sobre el uso del disco (de donde proviene su nombre). Manten eso en mente

disk usage != sum of file sizes

Porque cada archivo ocupa varios bloques en el sistema de archivos (ver, man mkfs.ext2por ejemplo). Esto significa que solo en una situación muy rara, el uso del disco de un archivo es igual a su tamaño real; para eso, el tamaño debe ser exactamente un múltiplo del tamaño del bloque.

Piense en los bloques del sistema de archivos como cuadros que contienen partes de archivos; cada uno puede contener una parte de un solo archivo.

Para la versión GNU de du, revisa la --apparent-sizeopción.


Una situación aún más interesante puede tener lugar cuando hay algunos archivos dispersos en el sistema de archivos.


No existe tal opción (estoy en OS X, no en Linux). Probablemente sea necesario mencionar eso en una pregunta, ya que la etiqueta no es suficiente.)
Eimantas

Ah, claro ... Entonces eche un vistazo a la página de manual e intente encontrar referencias a actualo apparent. (También vea mi explicación actualizada).
rozcietrzewiacz

2
Correcto excepto por la desigualdad. Los tamaños de archivo a veces pueden ser mayores que el espacio en disco real necesario para almacenarlos. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez

@ StéphaneGimenez Wow ... gracias por decírmelo!
rozcietrzewiacz

2

Sobre Mac OS X y el Finder (en Snow Leopard, versión 10.6.8) he notado lo siguiente.

  • Obtengo el recuento de bytes para las cifras 'cuantificadas' del Finder de una ruta (archivo o carpeta) con el código (en bash(1)) a continuación.
  • La ventana y el panel "Información" del Finder muestran las cifras 'cuantificadas' (por ejemplo, kilo en KB) en bytes decimales (base 10, 1000) en oposición a los bytes binarios (base 2, 1024), de modo que 'cuantifico' dividiendo por 1000 y aumentar el prefijo de unidad (byte) 'cuantificador' (magnitud) y hacer un redondeo extraño "fuera de clave". (Mi código completo está lleno de código de desarrollo no comentado y está dividido en varios archivos (e idiomas), por lo que es difícil compartirlo).
    Hasta ahora he visto que mis cifras 'cuantificadas' son las mismas que las cifras 'cuantificadas' en el Finder .
  • Además, junto con el código, quiero decir que no tengo (y nunca he tenido ninguna) variable de entorno BLOCKSIZEestablecida en mi shell, pero probé (ahora, un poco) ambas versiones y los valores predeterminados para $BLOCKSIZEdan los mismos valores.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • El número no cuantificado que no he logrado igualar.
    Lo único que puedo decir es que me acerco contando solo los archivos (excluyendo así el directorio ~ 'meta-índice / encabezado del sistema de archivos' ~ datos) y que lo más cercano que obtengo es con lo siguiente.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Ni (xnu) du(1) ni (gnu) gdu(1) parecen contar atributos extendidos ( xattr)

Y luego debo simplemente jugar "Corre el camino y haz los cálculos".
Paz y buenas noches para esta vez.


1

En mi sistema Ubuntu, usando ext4, du -b fileda el tamaño en bytes de un archivo real, y du -b dirda el tamaño en bytes del archivo (s) + sobrecarga del directorio. La sobrecarga es, en mi caso, múltiplos de 4096 bytes.

Esta sobrecarga aumenta a medida que aumenta el número de archivos.
Nota: incluso si se eliminan los archivos, la sobrecarga del directorio permanece en el nivel más alto que tenía antes de eliminar los archivos.

No he intentado reiniciar para ver si se revierte, pero en cualquier caso, esto significa que el tamaño del directorio varía según las circunstancias históricas.

El recuento de cada tamaño de archivo puede ser la mejor opción para obtener un valor preciso del tamaño total de los archivos .

El siguiente script totaliza todos los tamaños de archivo (en bytes).

Para OS X, si no tiene la -bopción para 'du', puede usarla staten su lugar. (Si la tiene :) ... La línea comentada muestra la statalternativa de Ubuntu a du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

2
OSX no tienedu -b y un diferentestat . Su script no es portátil fuera de Linux de ninguna manera.
Gilles 'SO- deja de ser malvado'

Con MacPorts en OS X puede instalar coreutilspara obtener la versión GNU de duas gdu. Por lo tanto, no es exactamente portátil, pero puede ser útil para las personas en OS X para obtener las versiones GNU de algunas utilidades principales.
drfrogsplat

1

Suma todos los archivos en un directorio:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'


find: unrecognized: -printf. Imagen alpina
gadelat
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.