Question Comment trouver des fichiers et totaliser leurs tailles?


Je voudrais trouver une série de fichiers (basés sur une expression générique) et totaliser leur utilisation de disque.

Quelque chose comme ça:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

Ce travail. Mais cela ne produit pas le résultat que je recherche. Il répertorie l'espace utilisé par chaque fichier, comme find itère à travers eux.

Ce que je veux c'est le total du pour tous les fichiers trouvés.


8
2017-12-18 23:48


origine




Réponses:


Solution

En fournissant l'option -c (ou --total) à du(1), vous pouvez lui demander de produire un grand total. Si votre mise en œuvre de du(1) prend en charge l'une de ces options, vous pouvez obtenir l'effet souhaité en utilisant la commande suivante:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

Explication

La différence entre la sémantique de -exec command {} \; et -exec command {} + est le suivant:

  • command {} \; exécute command une fois pour chaque résultat de find. Le chemin du résultat est passé au lieu de {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
    
  • command {} + exécute command, lorsque tous les résultats ont été récupérés. Les noms de chemin des résultats sont transmis au lieu de {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3
    

Pour en savoir plus sur les options de du(1) et find(1), vous devriez consulter les pages de manuel respectives.


9
2017-12-19 06:55



Vous pourriez vous retrouver avec plusieurs totaux si le nombre de fichiers est important (1K +) en raison du nombre de limitations des arguments de la ligne de commande. - ychaouche


Essaye ça:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

La commande d'origine donne un argument, puis l'exécute jusqu'à ce qu'il passe en revue tous les arguments. De cette façon, vous donnez simplement tous les arguments à la fois, puis vous coupez les différentes tailles et ne laissez que le total. Vous pouvez supprimer le tuyau et la queue pour afficher la taille de chaque fichier si vous le souhaitez.


4
2017-12-19 00:15



Cela ne produira pas de résultats corrects avec des noms de chemins contenant des espaces. La bonne façon de faire est d'utiliser le -exec du -c {} + option de find, qui passera les noms de chemins sans modification à du. - Witiko


Vous pouvez essayer ceci:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

3
2017-12-26 10:29





J'aurais find elle-même imprime la taille et utilise un autre outil pour calculer le total:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

Si vous voulez aussi voir les noms de fichiers:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

2
2017-12-19 00:07





Une ligne qui devrait fonctionner pour obtenir un total de gigaoctets sur la plupart des systèmes:

echo "$ (($ (find. -name 'flibble *' -ctime +90 -type f -printf '% k +') 0) / 1024/1024)) GB"


1
2017-12-19 15:22