ver tamaño subcarpetas script por pesa listar español ejemplos cuanto carpetas carpeta archivos archivo linux shell

linux - subcarpetas - Calcule el tamaño de los archivos en shell



tamaño de un archivo en linux (15)

Estoy tratando de calcular el tamaño total en bytes de todos los archivos (en un árbol de directorios) que coincidan con un patrón de nombre de archivo simplemente usando el shell. Esto es lo que tengo hasta ahora:

find -name * .undo -exec stat -c% s {} /; | awk ''{total + = $ 1} END {print total}''

¿Hay alguna forma más fácil de hacer esto? Siento que debería haber un simple interruptor du o find que hace esto por mí, pero no puedo encontrar uno.

Para ser claro, quiero totalizar los archivos que coincidan con un patrón en cualquier lugar bajo un árbol de directorios que significa

du -bs * .undo

no funcionará porque solo coincide con los archivos en el directorio actual.


¿Qué tal este simple?

find ./ -name *.undo | xargs wc


Con zsh, puede usar globbing extendido para hacer:

du -c ** / *. deshacer


Creo que la versión con xargs podría ser imroved (simplificada) ls -1 * .undo | xargs wc


O bien, puedes hacer esto:

dir=$1 for file in $dir/* ; do length_file=`stat -c %s $file` echo "File $file has length $length_file" length_total=`expr $length_total + $length_file` done echo "Total length: $length_total ."

Donde stat muestra un archivo o estado del sistema de archivos. El argumento -c significa usar el formato especificado en lugar del predeterminado, y la secuencia de formato $ s permite visualizar el tamaño total de los bytes.

expr

Solo evalúa una expresión.


Perl one-liner:

find . -name "*.undo" -ls | perl -lane ''$t += $F[6]; END{print $t}''

El array @F autosplit comienza en el índice $F[0] mientras que los campos awk comienzan con $ 1, por lo tanto se usa $F[6] lugar de los $7 de awk


Python es parte de la mayoría de las distribuciones de Linux.

import os import fnmatch size= 0 for path, dirs, files in os.walk( ''.'' ): for f in files: if fnmatch.fnmatch(f,''*.py''): fileSize= os.path.getsize( os.path.join(path,f) ) print f, fileSize size += fileSize print size

Longish, pero perfectamente claro y altamente extensible.


También he estado viendo este problema (solo un año después ...): solo encontré esta página.

Algo que encontré que funciona (para mí) es el siguiente:

find /mnt/iso -name *.avi -printf "%s/n" | paste -sd+ - | bc

Esto devolverá el tamaño total de todos los archivos .avi en todas las subcarpetas a continuación / mnt / iso

Tengo que dar crédito a radoulov por el comando pegar - ver esta página: comando de Shell para sumar enteros, uno por línea?

Solo para agregar, solo en el caso de que una carpeta coincida con el término de búsqueda, es una buena idea usar -type f en el comando find también.


Tratar:

find . -name "*.undo" -ls | awk ''{total += $7} END {print total}''

En mi sistema, el tamaño del archivo es el séptimo campo en la salida de find -ls . Si su resultado find … -ls salida es diferente, ajuste.

En esta versión, usar la información de directorio existente (tamaño de archivo) y la función ls incorporada de find debería ser eficiente, evitando creaciones de proceso o archivo de E / S.


Utilizo el comando du como este para obtener el número solo:

du file_list | awk ''{s+=$1} END {print s}''


Verifique el comando du (uso del disco).


du -c | awk ''/./{line=$0} END {print $ 1}''


du -c *pattern*

Esto imprimirá el total en la última línea de salida.


find -name ''*.undo'' -exec wc -c {} + | tail -n 1

debería dar el número total real de bytes en los archivos, si no tiene demasiados archivos (donde "demasiados" va a ser un número realmente grande, probablemente en miles). O si solo quieres obtener el número solo,

find -name ''*.undo'' -exec wc -c {} + | tail -n 1 | cut -d'' '' -f 1


find -name ''*.undo'' -print0 | du -hc --files0-from=- | tail -n 1

gerdemb partir de las contribuciones de Gerdemb y Strager. El uso de du -cb debe mostrar los bytes.


find -name *.undo -print0 | du -hc --files0-from=-