Supposons qu’il existe un répertoire de stockage d’images, disons, ./photos/john_doe
dans lequel se trouvent plusieurs sous-répertoires, contenant de nombreux fichiers (par exemple, *.jpg
). Comment puis-je calculer une taille de résumé de ces fichiers sous la john_doe
branche?
J'ai essayé du -hs ./photos/john_doe/*/*.jpg
, mais cela ne montre que les fichiers individuels. En outre, cela ne suit que le premier niveau d'imbrication du john_doe
répertoire, comme john_doe/june/
, mais ignore john_doe/june/outrageous/
.
Alors, comment pourrais-je traverser toute la branche, en résumant la taille de certains fichiers?
la source
LC_ALL=POSIX
comme préfixe pour toujours grep un total comme celui-ci:LC_ALL=POSIX find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
-name
, remplacez grep pargrep -P "\ttotal$"
sinon, tous les fichiers se terminant par "total" seront également capturés.bc
, voici donc une solution plus portable:find -name '*.jpg' -type f -exec du -bc {} + | grep total$ | cut -f1 | awk '{ total += $1 }; END { print total }'
me donne l'utilisation totale de mes
.jpg
fichiers dans ce répertoire.Pour gérer plusieurs annuaires, vous devrez probablement combiner cela avec
find
.Vous pourriez trouver des exemples de commande utiles (cela inclut aussi
find
)la source
-R
option sur man7.org/linux/man-pages/man1/du.1.html . Et je ne pense pas qu'une option récursive serait utile dans ce cas, car le shell effectue l'expansion globale avant de transmettre les arguments àdu
.Avant tout, vous avez besoin de deux choses:
-c
possibilité dedu
lui dire de produire un grand total;**
( instructions d'activation ) oufind
( exemple ) ou pour parcourir les sous-répertoires.la source
find
peut renvoyer des résultats erronés.du -ch -- ./{dir1,dir2}/*.jpg
oudu -ch -- ./{prefix1*,prefix2*}.jpg
Argument list too long
erreur lors du traitement d'environ 300k fichiers texte.getconf ARG_MAX
. Si vous en avez plus, vous devrez traiter les fichiers un par un ou par lots avec une boucle for.La réponse ultime est:
et même une version plus rapide, non limitée par la RAM, mais qui nécessite GNU AWK avec le support bignum:
Cette version présente les fonctionnalités suivantes:
find
spécifier les fichiers que vous recherchezfind
fait une simple correspondance générique des noms de fichiers5.5K
,176.7M
, ...)| numfmt --to=si
la source
Les réponses données jusqu'à présent ne tiennent pas compte du fait que la liste de fichiers passée de find en du peut être si longue que find divise automatiquement la liste en morceaux, ce qui entraîne plusieurs occurrences de
total
.Vous pouvez soit
grep total
(locale!) Et résumer manuellement, ou utiliser une commande différente. Autant que je sache, il n’ya que deux façons d’obtenir un total général (en kilo-octets) de tous les fichiers trouvés par find:find . -type f -iname '*.jpg' -print0 | xargs -r0 du -a| awk '{sum+=$1} END {print sum}'
Explanation
find . -type f -iname '*.jpg' -print0
: Recherchez tous les fichiers portant l'extension jpg indépendamment de la casse (* .jpg, * .JPG, * .Jpg ...) et exportez-les (à terminaison nulle).xargs -r0 du -a
: -r: Xargs appelle la commande même sans arguments passés, ce qui empêche -r. -0 signifie des chaînes terminées par null (non terminées par une nouvelle ligne).awk '{sum+=$1} END {print sum}'
: Résume la taille des fichiers générés par la commande précédenteEt pour référence, l’autre voie serait
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-
la source
du --file0-from
pris plus de temps parce que vous l'avez exécuté en premier (effet de mise en cache).xargs
, plusieursdu -a
peuvent être exécutés, de sorte que vous pouvez avoir des divergences s’il existe des liens solides.Si la liste de fichiers est trop longue pour pouvoir être transmise à un seul appel de
du -c
, sur un système GNU, vous pouvez effectuer les opérations suivantes:(taille exprimée en nombre de blocs de 512 octets). Comme
du
s'il essayait de compter les liens durs seulement une fois. Si vous ne vous souciez pas des liens durs, vous pouvez le simplifier pour:Si vous souhaitez utiliser la taille plutôt que l'utilisation du disque, remplacez
%b
par%s
. La taille sera alors exprimée en octets.la source
-bash: bc: command not found
Centos - Linux 2.6.32-431.el6.x86_64bc
est une commande POSIX non facultative.Les solutions mentionnées jusqu'à présent sont inefficaces (l'exécutif est coûteux) et nécessitent un travail manuel supplémentaire si la liste de fichiers est longue ou si elles ne fonctionnent pas sous Mac OS X. La solution suivante est très rapide et devrait fonctionner sur n'importe quel système. donne la réponse totale en Go (supprimez a / 1024 si vous voulez voir le total en Mo):
find . -iname "*.jpg" -ls |perl -lane '$t += $F[6]; print $t/1024/1024/1024 . " GB"'
la source
-iname
ni-ls
portable, il ne fonctionnera donc sur aucun système . Cela ne fonctionnera pas non plus correctement s'il existe des noms de fichiers ou des cibles de liens symboliques contenant des caractères de nouvelle ligne.Améliorer la réponse géniale de SHW pour le rendre compatible avec n’importe quel lieu, comme Zbyszek l’a déjà souligné dans son commentaire:
la source
du traverse naturellement la hiérarchie des répertoires et awk peut effectuer le filtrage, ce qui peut suffire:
Cela fonctionne sans GNU.
la source
stat
appel pour les fichiers qui ne correspondent pas au modèle recherché.