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