Mostrar la suma de los tamaños de archivo en el listado del directorio

72

El dircomando de listado de directorio de Windows tiene una línea al final que muestra la cantidad total de espacio ocupado por los archivos enumerados. Por ejemplo, dir *.exemuestra todos los .exearchivos en el directorio actual, sus tamaños y la suma total de sus tamaños. Me encantaría tener una funcionalidad similar con mi diralias en bash, pero no estoy seguro de cómo hacerlo.

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

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 }'

lo que me da el total, pero no imprime el listado del directorio en sí. ¿Hay alguna manera de alterar esto en una línea de comandos o script de shell para que pueda pasar cualquier lsargumento que desee diry obtener una lista completa más la suma total? Por ejemplo, me gustaría ejecutar dir -R *.jpg *.tifpara obtener la lista y el tamaño total de esos tipos de archivos en todos los subdirectorios. Idealmente, sería genial si pudiera obtener el tamaño de cada subdirectorio, pero esto no es esencial.

MattDMo
fuente
55
¿Por qué no ls -lhte ayuda? Imprime la suma total en la parte superior. También puede ejecutar du -sh *.exepara obtener información sobre el uso del espacio en disco en forma legible para humanos.
bagavadhar
@ashwin No sé qué ls -lhestá imprimiendo el 'total' , pero no siempre está relacionado con lo que awkcalculan los siguientes scripts o lo que sumo a mano. A veces está cerca del número de KB de archivos en el directorio, pero no parece tener vigencia los tamaños asignados de subdirectorios. Le agradecería que me indicara una explicación de qué es exactamente ese número ...
MattDMo
mira si mi respuesta a continuación funciona para ti
bagavadhar
1
ls -lhno muestra el tamaño total de un directorio calculando su contenido
aequalsb

Respuestas:

24

La siguiente función hace la mayor parte de lo que está pidiendo:

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

... pero no te dará lo que estás pidiendo dir -R *.jpg *.tif, porque no es así como ls -Rfunciona. Es posible que desee jugar con la findutilidad para eso.


fuente
1
Esto es cierto, si está buscando esencialmente el tamaño del contenido de cada archivo, NO el tamaño que consume el archivo en el disco. Esta distinción es más pronunciada para archivos muy pequeños. En mi distribución, a cada archivo se le asigna espacio en el disco en fragmentos de 4 KB (por lo que un archivo de 300 bytes todavía usa 4K en un disco, según lo informado por el comando du). Dado que eso es lo que buscaba el OP "cuánto espacio ocupa cada archivo", entonces du es la forma de hacerlo.
Jon V
1
dirya es el nombre de un núcleo de GNU popular, prefiero no nombrar una función como esa.
postre
Arregle para que funcione tanto en Linux como en OS-S y su "-a" incluya "." y "..", que no es bueno:) Aquí está el comando fijo: dir () {ls -FAl "$ {@}" | awk '{total + = $ 5; impresión }; END {print "total:" total} '; }
Dmitry Shevkoplyas
148

Ya hay un comando UNIX para esto: du

Solo haz:

du -ach 

Según la convención, puede agregar una o más rutas de archivo o directorio al final del comando. -hes una extensión para convertir el tamaño a un formato amigable para los humanos, -ale da el tamaño "aparente" (tamaño del archivo en lugar del uso del disco) y -cda un total al final.

Pete Cornell
fuente
12
Sí, du funciona bien. Puede usar la opción -c (igual que --total) para obtener un total al final de la lista.
MikeB
66
Tenga en cuenta que duproporciona el uso del disco, no la suma de los tamaños de archivo.
Stéphane Chazelas
77
du -hno suma los tamaños de los archivos que se le pasan. du -h *.somuestra el tamaño de cada archivo, pero no la suma. Creo que lo que quieres aquí es du -hc *.so(o incluso du -hc *.so | tail -1). Pero, por supuesto, él también quiere el listado del directorio.
Expiación limitada el
1
Este comando solo funciona con una breve lista de archivos. ¡Mira lo que sucede cuando tienes 850000 archivos en un directorio!
Hamid FzM
3
! -asignifica --all. Considere la posibilidad de usar--apparent-size
Arnauld VM
17

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

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

mani deepak
fuente
15
du -hs directorysi solo quieres el total.
Stéphane Chazelas
8

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

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

con perl:

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

Tamaño de todos los archivos PDF no ocultos en el directorio actual.

ingopingo
fuente
1

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 hallazgo. Sé que ejecutar find dos veces no es una idea muy eficiente. Pero no podría pensar en una mejor manera. Al menos hace el trabajo.

bagavadhar
fuente
1

Usar du y una declaración awk como la mencionada anteriormente le proporcionará lo que está buscando.

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

Esto mostrará una lista de todos los archivos en la carpeta Descargas del usuario abc que termina en .jpg e imprime la suma de todos estos archivos al final de la lista.

usuario3085123
fuente
0

Para obtener ambos, la salida del directorio y el cálculo del tamaño, sin usar ninguna de las otras opciones propuestas, puede usar tee (1) y la sustitución del proceso ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
Janis
fuente
No es necesario tee, solodir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas
0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'
Tamer Mansour
fuente
3
No. Primero, solo dar una orden no es una respuesta. En segundo lugar, si te hubieras molestado en leer toda la pregunta, las otras respuestas y mis comentarios, habrías visto que esto NO es lo que quiero.
MattDMo
Para ser justos con el cartel, este es el primer resultado de búsqueda para la búsqueda de Google linux sum human readable sizesy es lo que estoy buscando.
Sridhar Sarnobat
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
jason
fuente
Esto no hace lo que estaba pidiendo.
MattDMo