web-dev-qa-db-fra.com

Calculer la taille des fichiers en 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 utilisant simplement le shell. C'est ce que j'ai jusqu'ici:

trouver -name * .undo -exec stat -c% s {} \; | awk '{total + = $ 1} END {print total}'

Y a-t-il un moyen plus facile de faire cela? Je pense qu'il devrait y avoir un simple commutateur du ou de trouver qui le fait pour moi, mais je ne parviens pas à en trouver un.

Pour être clair, je veux totaliser les fichiers correspondant à un modèle n'importe où dans une arborescence de répertoires, ce qui signifie

du -bs * .undo

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

53
yothenberg

Essayer:

find . -name "*.undo" -ls | awk '{total += $7} 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, utiliser les informations de répertoire existantes (taille du fichier) et la fonctionnalité ls intégrée de find devrait être efficace, évitant ainsi les créations de processus ou les entrées/sorties de fichiers. 

95
tpgould

Avec zsh, vous pouvez utiliser le globbing étendu pour effectuer les tâches suivantes:

du -c **/*. annuler

35
Chris AtLee
find -name *.undo -print0 | du -hc --files0-from=-
22
user27478
du -c *pattern*

Cela imprimera le total sur la dernière ligne de sortie.

18
Cantillon

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

Quelque chose que j'ai trouvé fonctionne (pour moi) est la suivante:

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 situés sous/mnt/iso

Je dois donner crédit à radoulov pour la commande coller - voir cette page: La 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 aussi une bonne idée d'utiliser -type f dans la commande de recherche.

9
T-Monster
find -name '*.undo' -exec wc -c {} + | tail -n 1

devrait donner le nombre total réel d'octets dans les fichiers, si vous n'avez pas trop de fichiers (où "trop" va être un très grand nombre, probablement par 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
David Z

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

Longue mais parfaitement claire et très extensible.

5
S.Lott
find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1

Rassemblez les contributions de gerdemb et de strager. Utiliser du -cb devrait afficher les octets.

3
xilef

J'utilise du commande comme ceci pour obtenir le numéro uniquement:

du file_list | awk '{s+=$1} END {print s}'
2
Hoang NT

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

0
Peter Cotton

Perl one-liner:

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

Le tableau @F autosplit commence à index $F[0] tandis que les champs awk commencent par $ 1, donc $F[6] est utilisé à la place du $7 de awk

0
Chris Koknat

Que diriez-vous de ce simple.

find ./ -name *.undo | xargs wc
0
Dennis Mathews

Ou, vous pouvez simplement faire ceci:

dir=$1

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 un fichier ou l'état du système de fichiers. L'argument -c signifie que vous utilisez le format spécifié à la place du format par défaut, et la séquence de formats $ s permet d'afficher la taille totale en octets.

expr 

Juste évalue une expression.

0
bliss_terra

Je pense que la version avec xargs pourrait être améliorée (simplifiée) Ls -1 * .undo | xargs wc

0
Jacob