2009-08-06 11 views
83

Cuando uso ls o du, tengo la cantidad de espacio en disco cada archivo está ocupando.tamaño total de los contenidos de todos los archivos en un directorio

necesito la suma total de todos los datos en los archivos y subdirectorios que obtendría si abría cada archivo y contaba los bytes. Puntos de bonificación si puedo obtener esto sin abrir cada archivo y contar.

+1

'ls' realidad muestra el número de bytes de cada archivo, no la cantidad de espacio en disco. ¿Es esto suficiente para tus necesidades? –

Respuesta

42

Uso du -sb:

du -sb DIR 

desea, puede agregar la opción h para una mayor producción fácil de usar: formato

du -sbh DIR 
+3

-b parece ser una opción ilegal para MacOS' du – lynxoid

+2

@lynxoid: Puede instalar la versión de GNU con cerveza: 'cerveza instalar coreutils'. Estará disponible como el comando 'gdu'. – neu242

9

de stat "% s" le da el número real de bytes en un archivo .

find . -type f | 
xargs stat --format=%s | 
awk '{s+=$1} END {print s}' 

Siéntase libre de sustituir su favourite method for summing numbers.

+3

Preferiblemente utilizar "encontrar type f -print0 |. Xargs -0 ..." para evitar problemas con ciertos nombres de archivo (que contienen espacios, etc.). – hlovdal

+0

sí, buen punto. si no estaba en bsd 4.2 no recuerdo usarlo :-( – Nelson

+1

'find -print0' y' xargs -0' son necesarios para nombres de archivos con espacios. OS X quiere 'stat -f% z'. – Kornel

93

Si desea que el 'tamaño aparente' (que es el número de bytes de cada archivo), no el tamaño ocupado por los archivos en el disco, utilice la opción -b o --bytes (si usted tiene un sistema Linux con GNU coreutils):

% du -sbh <directory> 
+1

funciona en mi cajas de sombreros rojos más nuevos, por desgracia, no en mi caja Dev incrustado. –

+3

hay una manera fácil de mostrar el “tamaño aparente” en formato legible por humanos? Cuando el uso de ' du -shb' (como lo sugiere esta respuesta), el entorno '-b' parece anular el ajuste de' -h'. –

+6

@MathiasBynens invertir el orden de las banderas (es decir, du -sbh

). Funciona para mí. –

4

Si utiliza busybox de "du" en el sistema emebedded, no se puede obtener un bytes exactos con du, sólo se puede obtener Kbytes.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary 

Usage: du [-aHLdclsxhmk] [FILE]... 

Summarize disk space used for each FILE and/or directory. 
Disk space is printed in units of 1024 bytes. 

Options: 
     -a  Show sizes of files in addition to directories 
     -H  Follow symbolic links that are FILE command line args 
     -L  Follow all symbolic links encountered 
     -d N Limit output to directories (and files with -a) of depth < N 
     -c  Output a grand total 
     -l  Count sizes many times if hard linked 
     -s  Display only a total for each argument 
     -x  Skip directories on different filesystems 
     -h  Print sizes in human readable format (e.g., 1K 243M 2G) 
     -m  Print sizes in megabytes 
     -k  Print sizes in kilobytes(default) 
1

Uso:

$ du -ckx <DIR> | grep total | awk '{print $1}' 

Dónde < DIR> es el directorio que desea inspeccionar.

El '-c' le da gran total de los datos que se extrae utilizando la parte 'grep total' del comando, y el recuento en Kbytes se extrae con el comando awk.

La única advertencia aquí es si usted tiene un subdirectorio que contiene el texto "total" que conseguirá escupir así.

12

sólo una alternativa:

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}' 

grep -v '^ d' excluirá los directorios.

+2

Perfecto, también agrega el -a param para obtener "archivos ocultos" (cualquier cosa que comience por un período) – Nicholi

+0

Aislado para un tipo de archivo específico (en este caso, PNG) y expresado en MB para mayor legibilidad: 'ls -lR | grep '.png $' | awk '{total + = $ 5} END {print "Total:", total/1024/1024, "MB"}' ' – MusikPolice

0

para Win32 DOS, puede:

c:> dir/s c: \ directorio \ le \ quiere

y la penúltima línea le dirá la cantidad de bytes que los archivos ocuparán.

Sé que esto lee todos los archivos y directorios, pero funciona más rápido en algunas situaciones.

1

Esto puede ayudar:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}' 

El comando anterior suma total de todos los archivos que salen del tamaño de directorios.

+0

Tenga en cuenta que esta solución es muy similar a la [respuesta] (/ a/1267205/1300170) por Barun. Pero esta solución no suma archivos en subdirectorios. – ruvim

1

du es útil, pero find es útil en caso de que desee calcular el tamaño de algunos archivos solamente (por ejemplo, utilizando el filtro por extensión). También tenga en cuenta que find ellos mismos pueden imprimir el tamaño de cada archivo en bytes. Para calcular un tamaño total que se puede conectar dc de comandos de la siguiente manera:

find . -type f -printf "%s + " | dc -e0 -f- -ep 

Aquí find genera la secuencia de órdenes para dc como 123 + 456 + 11 +. Aunque, el programa completo debe ser como 0 123 + 456 + 11 + p (recuerde la notación postfix).

Por lo tanto, para obtener el programa completo necesitamos poner 0 en la pila antes de ejecutar la secuencia desde stdin, e imprimir el número superior después de la ejecución (el comando p al final). lo logramos a través de dc opciones:

  1. -e0 se acaba de acceso directo para -e '0' que pone 0 en la pila,
  2. -f- es para leer y ejecutar comandos desde la entrada estándar (la generada por find aquí),
  3. -ep es para imprimir el resultado (-e 'p').

Para imprimir el tamaño en MiB como 284.06 MiB podemos utilizar -e '2 k 1024/1024/n [ MiB] p' en el punto 3 lugar (la mayoría de los espacios son opcionales).

0

Cuando se crea una carpeta, muchos sistemas de archivos Linux asignan 4096 bytes para almacenar algunos metadatos sobre el directorio en sí. Este espacio se incrementa en un múltiplo de 4096 bytes a medida que crece el directorio.

du de comandos (con o sin opción -b) toma en cuenta de este espacio, como se puede ver escribiendo:

mkdir test && du -b test 

tendrá un resultado de 4096 bytes para un directorio vacío. Por lo tanto, si coloca 2 archivos de 10000 bytes dentro del directorio, la cantidad total dada por du -sb sería 24096 bytes.

Si lees detenidamente la pregunta, esto no es lo que pediste. La persona preguntó:

la suma total de todos los datos en los archivos y subdirectorios que obtendría si abría cada archivo y contó los bytes

que en el ejemplo anterior debería ser 20000 bytes, no 24096.

Así, el mi humilde opinión respuesta correcta podría ser una mezcla de Nelson respuesta y hlovdal sugerencia para manejar nombres de fichero espacios que contienen:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}' 
1

Existen al menos tres maneras de conseguir la "suma total de todos los datos en archivos y subdirectorios "en bytes que funcionan tanto en Linux/Unix como en Git Bash para Windows, enumerados a continuación en orden de más rápido a más lento en promedio. Para su referencia, que fueron ejecutados en la raíz de un sistema de archivos bastante profunda (docroot en una instalación de Enterprise Magento 2 que comprende 71,158 30,027 archivos en directorios).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }' 
748660546 bytes 

real 0m0.221s 
user 0m0.068s 
sys  0m0.160s 

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes 
748660546 bytes 

real 0m0.256s 
user 0m0.164s 
sys  0m0.196s 

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes 
748660546 bytes 

real 0m0.553s 
user 0m0.308s 
sys  0m0.416s 


Estos dos una lso trabajo, sino que se basan en comandos que no existen en Git Bash para Windows:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes 
748660546 bytes 

real 0m0.233s 
user 0m0.116s 
sys  0m0.176s 

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes 
748660546 bytes 

real 0m0.242s 
user 0m0.104s 
sys  0m0.152s 


Si sólo desea el total para el directorio actual, luego agregue -maxdepth 1 a find.


Tenga en cuenta que algunas de las soluciones sugeridas no devuelven resultados precisos, por lo que se pegaba con las soluciones anteriores en su lugar.

$ du -sbh 
832M . 

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}' 
Total: 583772525 

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}' 
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option 
4390471 

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}' 
Total 968133 
Cuestiones relacionadas