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.
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.
Avec zsh, vous pouvez utiliser le globbing étendu pour effectuer les tâches suivantes:
du -c **/*. annuler
find -name *.undo -print0 | du -hc --files0-from=-
du -c *pattern*
Cela imprimera le total sur la dernière ligne de sortie.
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.
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
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.
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.
J'utilise du commande comme ceci pour obtenir le numéro uniquement:
du file_list | awk '{s+=$1} END {print s}'
du -c | awk '/./{line=$0} END {print $ 1}'
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
Que diriez-vous de ce simple.
find ./ -name *.undo | xargs wc
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.
Je pense que la version avec xargs pourrait être améliorée (simplifiée) Ls -1 * .undo | xargs wc