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.
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.
avec zsh, vous pouvez utiliser extended globbing pour faire:
du-c **/*.undo
du -c *pattern*
cela affichera le total sur la dernière ligne de sortie.
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.
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
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.
j'utilise la commande du comme ceci pour obtenir le numéro seulement:
du file_list | awk '{s+=} END {print s}'
Que pensez-vous de celle-ci?
find ./ -name *.undo | xargs wc
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.
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
je pense que la version avec xargs pourrait être améliorée (simplifié) ls -1 *.undo / xargs wc