Calculer la taille des fichiers dans shell

j'essaie de calculer la taille totale en octets de tous les fichiers (dans une arborescence de répertoires) correspondant à un motif de nom de fichier en utilisant simplement l'interpréteur de commandes. C'est ce que j'ai jusqu'à présent:

find-name *.undo-exec stat-C%s {} ; / awk '{total + = 1$} END {print total} ' 151910920"

y a-t-il un moyen plus simple de le faire? Je pense qu'il devrait y avoir un simple du ou trouver un interrupteur qui fait ça pour moi mais je n'en trouve pas.

pour être clair, je veux faire le total des fichiers correspondant à un motif n'importe où sous une arborescence de répertoires qui signifie

du-bs *.undo

ne fonctionnera pas car il ne correspond qu'aux fichiers du répertoire courant.

53
demandé sur yothenberg 2009-03-01 03:57:51

15 réponses

, Essayez:

find . -name "*.undo" -ls | awk '{total += } END {print total}'

sur mon système la taille du fichier est le septième champ de la sortie find -ls . Si votre sortie find … -ls est différente, ajustez.

dans cette version, en utilisant les informations du répertoire existant (Taille du fichier) et la fonctionnalité intégrée ls De find devrait être efficace, en évitant les créations de processus ou les entrées/sorties de fichiers.

95
répondu tpgould 2012-01-02 16:25:04

avec zsh, vous pouvez utiliser extended globbing pour faire:

du-c **/*.undo

35
répondu Chris AtLee 2009-03-01 03:00:12
find -name *.undo -print0 | du -hc --files0-from=-
22
répondu user27478 2009-05-18 00:43:58
du -c *pattern*

cela affichera le total sur la dernière ligne de sortie.

18
répondu Cantillon 2009-03-01 01:37:14

j'ai examiné ce problème aussi (seulement un an plus tard...) - ne viens de trouver cette page.

quelque chose que j'ai trouvé fonctionne (pour moi) est le suivant:

find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc

cela retournera la taille totale de tous les .fichiers avi dans tous les sous-dossiers ci-dessous/mnt / iso

je dois donner crédit à radoulov pour la commande coller - voir cette page: Commande Shell pour additionner des entiers, un par ligne?

juste pour ajouter - juste au cas où un dossier correspond au terme de recherche - c'est une bonne idée d'utiliser -type f dans la commande find aussi.

9
répondu T-Monster 2017-05-23 12:26:19
find -name '*.undo' -exec wc -c {} + | tail -n 1

devrait donner à l'effectif total nombre d'octets dans les fichiers, si vous n'avez pas trop de fichiers (où "trop" va être un très grand nombre, probablement en milliers). Ou si vous voulez juste obtenir le numéro seul,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1
8
répondu David Z 2009-03-01 07:54:02

Python fait partie de la plupart des distributions linux.

import os
import fnmatch
size= 0
for path, dirs, files in os.walk( '.' ):
    for f in files:
        if fnmatch.fnmatch(f,'*.py'):
            fileSize= os.path.getsize( os.path.join(path,f) ) 
            print f, fileSize
            size += fileSize
print size

Longuets, mais parfaitement clair et très extensible.

5
répondu S.Lott 2009-03-01 01:29:16
find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1

mis ensemble de gerdemb ' s et strager's contributions. L'utilisation de du -cb devrait afficher les octets.

3
répondu xilef 2017-05-23 12:34:34

j'utilise la commande du comme ceci pour obtenir le numéro seulement:

du file_list | awk '{s+=} END {print s}'
2
répondu Hoang NT 2013-07-18 18:43:30

Que pensez-vous de celle-ci?

find ./ -name *.undo | xargs wc
0
répondu Dennis Mathews 2013-02-08 18:50:09

Ou, vous pouvez simplement faire ceci:

dir=

for file in $dir/* ; do

 length_file=`stat -c %s $file`
 echo "File $file has length $length_file"
 length_total=`expr $length_total + $length_file`

done

echo "Total length: $length_total ."

où stat affiche l'état d'un fichier ou d'un système de fichiers. L'argument-c signifie utiliser le format spécifié au lieu du format par défaut, et la séquence de format $S permet l'affichage de la taille totale des octets.

expr 

évalue juste une expression.

0
répondu bliss_terra 2015-02-03 19:59:47

Perl one-liner:

find . -name "*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}'

le tableau autosplit @F commence à l'index $F[0] alors que les champs awk commencent avec $1, donc $F[6] est utilisé à la place de

de awk"
0
répondu Chris Koknat 2015-10-08 14:50:25

du-c | awk '/./ {line=0$} END{print $1}'

0
répondu Peter Cotton 2016-06-14 20:52:59

je pense que la version avec xargs pourrait être améliorée (simplifié) ls -1 *.undo / xargs wc

0
répondu Jacob 2017-05-11 16:07:40

cochez la commande du (utilisation du disque).

-3
répondu CMS 2009-03-01 01:04:24