Mostrar la sum de tamaños de file en la list de directorys

El command de listdo del directory de directorys de Windows tiene una línea al final que muestra la cantidad total de espacio ocupado por los files enumerados. Por ejemplo, dir *.exe muestra todos los files .exe en el directory actual, sus tamaños y la sum total de sus tamaños. Me encantaría tener una funcionalidad similar con mi alias de dir en bash, pero no estoy seguro de cómo hacerlo.

Actualmente, tengo alias dir='ls -FaGl' en mi .bash_profile , que muestra

 drwxr-x---+ 24 mattdmo 4096 Mar 14 16:35 ./ drwxr-x--x. 256 root 12288 Apr 8 21:29 ../ -rw------- 1 mattdmo 13795 Apr 4 17:52 .bash_history -rw-r--r-- 1 mattdmo 18 May 10 2012 .bash_logout -rw-r--r-- 1 mattdmo 395 Dec 9 17:33 .bash_profile -rw-r--r-- 1 mattdmo 176 May 10 2012 .bash_profile~ -rw-r--r-- 1 mattdmo 411 Dec 9 17:33 .bashrc -rw-r--r-- 1 mattdmo 124 May 10 2012 .bashrc~ drwx------ 2 mattdmo 4096 Mar 24 20:03 bin/ drwxrwxr-x 2 mattdmo 4096 Mar 11 16:29 download/ 

por ejemplo. Tomando las respuestas de esta pregunta :

 dir | awk '{ total += $4 }; END { print total }' 

que me da el total, pero no imprime el listdo del directory. ¿Hay alguna forma de alterar esto en un script de una sola línea o de shell para poder pasar cualquier argumento de ls que quiera dir y get una list completa más la sum total? Por ejemplo, me gustaría ejecutar dir -R *.jpg *.tif para get la list y el tamaño total de esos types de files en todos los subdirectorys. Idealmente, sería genial si pudiera get el tamaño de cada subdirectory, pero esto no es esencial.

La siguiente function hace la mayor parte de lo que está pidiendo:

 dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; } 

… pero no le dará lo que está pidiendo de dir -R *.jpg *.tif , porque así no es como ls -R funciona. Es posible que desee jugar con la utilidad de find para eso.

Ya hay un command de UNIX para esto: du

Solo haz:

 du -h 

Según la convención, puede agregar una o más routes de files o directorys al final del command. -h es una extensión para convertir el tamaño en un formatting amigable para los humanos.

Simplemente imprima la línea actual que está sumndo el total de:

 dir | awk '{ print; total += $4 }; END { print "total size: ",total }' 

Puede usar du -h -c directory|tail -1

Esto generará una sola línea con uso de memory.

con perl:

 perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf 

Tamaño de todos los files PDF no ocultos en el directory actual.

Agregar lo siguiente a .bash_profile o .bashrc funciona para mí.

 dir () { find . -iname "$@" -exec ls -lh {} \; find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1; } 

Ahora cuando hago un dir * .mp3 lo hace recursivamente e imprime el total al final. Puede controlar la profundidad que desea agregando un parámetro maxdepth al find. Sé que correr dos veces no es una idea muy eficaz. Pero no pude pensar en una mejor manera. Al less hace el trabajo.

El uso de du y una statement awk como la mencionada anteriormente proporcionará lo que está buscando.

Ejemplo: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }' du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Esto mostrará una list de todos los files en la carpeta Descargas del usuario que termina en .jpg e imprime la sum de todos estos files al final de la list.

Para get el cálculo de salida y tamaño de dir, sin usar ninguna de las otras opciones propuestas, puede usar tee (1) y sustitución de process …

 dir | tee >( awk '{ total += $4 }; END { print total }' ) 
 du * | awk -v sum=0 '{print sum+=$1}' | tail -1 
 du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'