web-dev-qa-db-fra.com

taille totale du groupe de fichiers sélectionné avec «trouver»

Par exemple, j'ai un grand système de fichiers qui se remplit plus rapidement que prévu. Je cherche donc ce qui est ajouté:

find /rapidly_shrinking_drive/ -type f -mtime -1 -ls | less

Et je trouve, eh bien, beaucoup de choses. Des milliers de fichiers de six à sept types. Je peux distinguer un type et les compter:

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 -ls | wc -l

mais ce que j'aimerais vraiment, c'est pouvoir obtenir la taille totale sur disque de ces fichiers:

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 | howmuchspace

Je suis ouvert à un one-liner Perl pour cela, si quelqu'un en a un, mais je ne vais pas utiliser de solution impliquant un script multi-lignes ou File :: Find.

42
Ed Hyer

La commande du vous renseigne sur l'utilisation du disque. Exemple d'utilisation pour votre cas spécifique:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 -print0 | du --files0-from=- -hc | tail -n1

(Auparavant, j'écrivais du -hs, mais sur ma machine qui semble ignorer l'entrée de find et résume à la place la taille du cwd.)

65
Stephan202

Bon sang, Stephan202 a raison. Je n'ai pas pensé à du -s (résumé), alors j'ai plutôt utilisé awk:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 | du | awk '{total+=$1} END{print total}'

Mais j'aime mieux l'autre réponse, et c'est presque certainement plus efficace.

14
pix0r

avec GNU find,

 find /path -name "offender" -printf "%s\n" | awk '{t+=$1}END{print t}'
7
ghostdog74

Je voudrais promouvoir le commentaire de Jason ci-dessus au statut de réponse, car je pense que c'est le plus mnémonique (mais pas le plus générique, si vous devez vraiment avoir la liste de fichiers spécifiée par find):

$ du -hs *.nc
6.1M  foo.nc
280K  foo_region_N2O.nc
8.0K  foo_region_PS.nc
844K  foo_region_xyz.nc
844K  foo_region_z.nc
37M   ETOPO1_Ice_g_gmt4.grd_region_zS.nc
$ du -ch *.nc | tail -n 1
45M total
$ du -cb *.nc | tail -n 1
47033368  total
3
TomRoche

J'ai essayé toutes ces commandes mais pas de chance. J'ai donc trouvé celui-ci qui me donne une réponse:

find . -type f -mtime -30 -exec ls -l {} \; | awk '{ s+=$5 } END { print s }'
1
Vlad Savitsky