Afficher la somme des tailles de fichiers dans la liste de répertoires

72

La dircommande de liste de répertoires Windows comporte une ligne à la fin indiquant la quantité totale d’espace occupé par les fichiers répertoriés. Par exemple, dir *.exeaffiche tous les .exefichiers du répertoire en cours, leurs tailles et la somme totale de leurs tailles. J'adorerais avoir une fonctionnalité similaire avec mon diralias dans bash, mais je ne sais pas exactement comment s'y prendre.

Actuellement, j'ai alias dir='ls -FaGl'dans mon .bash_profile, montrant

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/

par exemple. En prenant les réponses de cette question :

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

ce qui me donne le total, mais n'imprime pas le répertoire lui-même. Existe-t-il un moyen de modifier cela en un script one-liner ou shell afin que je puisse transmettre tous les lsarguments que je souhaite diret obtenir une liste complète plus le total? Par exemple, j'aimerais exécuter dir -R *.jpg *.tifla liste et la taille totale de ces types de fichiers dans tous les sous-répertoires. Idéalement, ce serait bien si je pouvais obtenir la taille de chaque sous-répertoire, mais ce n'est pas essentiel.

MattDMo
la source
5
Pourquoi ne t'aide ls -lhpas? Il imprime la somme totale en haut. Vous pouvez également exécuter du -sh *.exepour obtenir des informations d'utilisation de l'espace disque sous une forme lisible par l'homme.
bagavadhar
@ashwin Je ne sais pas ce que le "total" ls -lhimprime, mais ce n'est pas toujours lié à ce que les awkscripts ci-dessous calculent, ni à ce que j'ajoute à la main. Parfois, il est proche du nombre de Ko de fichiers dans le répertoire, mais cela ne semble pas tenir compte de la taille allouée des sous-répertoires. Je vous serais reconnaissant de m'indiquer une explication exacte de ce nombre ...
MattDMo
voyez si ma réponse ci-dessous fonctionne pour vous
bagavadhar
1
ls -lhne montre pas le total de la taille d'un
répertoire qui

Réponses:

24

La fonction suivante fait la plupart de ce que vous demandez:

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

... mais cela ne vous donnera pas ce que vous demandez dir -R *.jpg *.tif, car ce n'est pas comme ça que ça ls -Rmarche. Vous voudrez peut-être jouer avec l' findutilitaire pour cela.


la source
1
Cela est vrai, si vous recherchez essentiellement la taille du contenu de chaque fichier, PAS la taille que le fichier consomme sur le disque. Cette distinction est plus prononcée pour les très petits fichiers. Sur ma distribution, chaque fichier se voit allouer de l'espace sur le disque en morceaux de 4 Ko (un fichier de 300 octets utilise toujours 4K sur un disque, comme indiqué par la commande du). Etant donné ce que recherchait le PO "quelle est la quantité d'espace occupée par chaque fichier", c'est donc la manière de le faire.
Jon V
1
direst déjà le nom d’un coreutil populaire, je préférerais ne pas nommer une fonction comme celle-là.
dessert
S'il vous plaît réparer afin que cela fonctionne à la fois sur Linux et OS-S et votre "-a" include "." et "..", ce qui n’est pas bon :) Voici la commande fixe: dir () {ls -FAl "$ {@}" | awk '{total + = 5 $; impression }; END {print "total:" total} '; }
Dmitry Shevkoplyas
148

Il existe déjà une commande UNIX pour cela: du

Il suffit de faire:

du -ach 

Selon la convention, vous pouvez ajouter un ou plusieurs chemins de fichier ou de répertoire à la fin de la commande. -hest une extension permettant de convertir la taille en un format convivial, -aqui vous donne la taille "apparente" (taille du fichier au lieu de l'utilisation du disque) et qui -cdonne un total à la fin.

Pete Cornell
la source
12
Oui, ça marche bien. Vous pouvez utiliser l'option -c (identique à --total) pour obtenir un total à la fin de la liste.
MikeB
6
Notez que cela dudonne l'utilisation du disque, pas la somme des tailles de fichiers.
Stéphane Chazelas
7
du -hne résume pas la taille des fichiers qui lui sont transmis. du -h *.soaffiche la taille de chaque fichier, mais pas la somme. Je pense que ce que vous voulez ici est du -hc *.so(ou même du -hc *.so | tail -1). Mais bien sûr, il veut aussi la liste des répertoires.
Expiation limitée le
1
Cette commande ne fonctionne qu'avec une courte liste de fichiers. Voyez ce qui se passe quand vous avez 850000 fichiers dans un répertoire !!!
Hamid FzM
3
! -ades moyens --all. Considérez plutôt utiliser--apparent-size
Arnauld VM
17

Vous pouvez utiliser du -h -c directory|tail -1

Cela générera une seule ligne avec l'utilisation de la mémoire.

Mani Deepak
la source
15
du -hs directorysi vous voulez seulement le total.
Stéphane Chazelas
8

Imprimez simplement la ligne courante que vous additionnez:

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

avec perl:

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

Taille de tous les fichiers PDF non masqués dans le répertoire actuel.

ingopingo
la source
1

Ajouter ce qui suit à .bash_profile ou .bashrc fonctionne pour moi.

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

Maintenant, quand je fais un dir * .mp3, il le fait de manière récursive et affiche le total à la fin. Vous pouvez contrôler la profondeur souhaitée en ajoutant un paramètre maxdepth à la recherche. Je sais que courir deux fois n’est pas une idée très efficace. Mais je ne pouvais pas penser à un meilleur moyen. Au moins, le travail est fait.

bagavadhar
la source
1

En utilisant du et une déclaration awk comme celle mentionnée ci-dessus, vous obtiendrez ce que vous recherchez.

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

Ceci listera tous les fichiers du dossier Téléchargements de l'utilisateur abc se terminant par .jpg et affichera la somme de tous ces fichiers à la fin de la liste.

utilisateur3085123
la source
0

Pour obtenir à la fois une sortie dir et un calcul de taille, sans utiliser aucune des autres options proposées, vous pouvez utiliser tee (1) et la substitution de processus ...

dir | tee >( awk '{ total += $4 }; END { print total }' )
Janis
la source
Pas besoin tee, c'est justedir | 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
la source
3
Non. D'abord, donner une commande n'est pas une réponse. Deuxièmement, si vous aviez pris la peine de lire toute la question, les autres réponses et mes commentaires, vous auriez vu que ce n’est PAS ce que je veux.
MattDMo
Pour être juste avec l'affiche, c'est le premier résultat de recherche pour la recherche Google linux sum human readable sizeset c'est ce que je recherche.
Sridhar Sarnobat
-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1
Jason
la source
Cela ne fait pas ce que je demandais.
MattDMo