Taille totale du contenu de tous les fichiers dans un répertoire [fermé]

103

Lorsque j'utilise lsou du, j'obtiens la quantité d'espace disque occupée par chaque fichier.

J'ai besoin de la somme totale de toutes les données des fichiers et sous-répertoires que j'obtiendrais si j'ouvrais chaque fichier et comptais les octets. Des points bonus si je peux l'obtenir sans ouvrir chaque fichier et sans compter.

Arthur Ulfeldt
la source
1
lsaffiche en fait le nombre d'octets dans chaque fichier, pas la quantité d'espace disque. Est-ce suffisant pour vos besoins?
Greg Hewgill
3
Notez que ducela ne peut pas être utilisé pour répondre à cette question. Il montre la quantité d'espace disque que le répertoire occupe sur le disque (les données des fichiers plus la taille des méta-informations du système de fichiers auxiliaire). La dusortie peut être encore plus petite que la taille totale de tous les fichiers. Cela peut se produire si le système de fichiers peut stocker des données compressées sur le disque ou si des liens physiques sont utilisés. Les bonnes réponses sont basées sur lset find. Voir les réponses de Nelson et de bytepan ici, ou cette réponse: unix.stackexchange.com/a/471061/152606
anton_rh

Réponses:

108

Si vous voulez la 'taille apparente' (c'est-à-dire le nombre d'octets dans chaque fichier), pas la taille occupée par les fichiers sur le disque, utilisez l' option -bou --bytes(si vous avez un système Linux avec GNU coreutils ):

% du -sbh <directory>
Arkady
la source
1
fonctionne sur mes nouvelles boîtes à chapeau rouge, malheureusement pas sur ma boîte de développement intégrée.
Arthur Ulfeldt
3
Existe-t-il un moyen simple d'afficher la «taille apparente» dans un format lisible par l'homme? Lors de l'utilisation du -shb(comme suggéré par cette réponse), le -bparamètre semble remplacer le -hparamètre.
Mathias Bynens
6
@MathiasBynens Inversez l'ordre des indicateurs (c'est-à-dire du -sbh <dir>). Travaille pour moi.
Luis E.
2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi
2
@Arkady J'ai essayé votre solution sur CentOS et Ubuntu, et il y a une petite erreur. Vous voulez "du -sbh". Le drapeau "-h" doit venir en dernier.
theJollySin
46

Utilisez du -sb:

du -sb DIR

En option, ajoutez l' hoption pour une sortie plus conviviale:

du -sbh DIR
Rob
la source
4
-b semble être une option illégale pour MacOS 'du
lynxoid
3
@lynxoid: Vous pouvez installer la version GNU BREW: brew install coreutils. Il sera disponible en tant que commande gdu.
neu242
1
Ne marche pas. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Ce n'est certainement pas la taille totale du contenu, mais la taille que le répertoire occupe sur le disque.
anton_rh
24

cd dans le répertoire, puis:

du -sh

ftw!

A l'origine écrit à ce sujet ici: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/

AO_
la source
1
C'est simple et ça marche! Merci. Parfois, j'aime ajouter l' -Loption qui dusuit les liens symboliques.
conradkleinespel
2
fonctionne pour moi (sur OS X)
sam boosalis
2
Ceci est simple et ne fonctionne pas. Il imprime l'espace occupé par le répertoire sur le disque, et non la taille totale du contenu qui pourrait être calculée en ouvrant chaque fichier et en comptant les octets.
anton_rh
17

Juste une alternative:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' exclura les répertoires.

Barun
la source
4
Parfait, ajoutez également le paramètre -a pour obtenir des "fichiers cachés" (tout ce qui commence par un point)
Nicholi
Isolé à un type de fichier spécifique (dans ce cas, PNG) et exprimé en Mo pour plus de lisibilité: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice
C'est une bonne réponse. Contrairement à ducette solution, compte vraiment la taille totale de toutes les données dans les fichiers comme si elles étaient ouvertes une par une et que leurs octets étaient comptés. Mais oui, l'ajout du -Aparamètre est également nécessaire pour compter les fichiers cachés.
anton_rh
13

Le format "% s" de stat vous donne le nombre réel d'octets dans un fichier.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

N'hésitez pas à remplacer votre méthode préférée pour la somme des nombres .

Nelson
la source
4
Utilisez de préférence "find. -Type f -print0 | xargs -0 ..." pour éviter les problèmes avec certains noms de fichiers (contenant des espaces, etc.).
hlovdal
1
ouais, bon point. si ce n'était pas dans bsd 4.2, je ne me souviens pas de l'utiliser :-(
Nelson
3
find -print0et xargs -0sont nécessaires pour les noms de fichiers avec des espaces. OS X veut stat -f %z.
Kornel
1
(Notez que stat fonctionne avec des fichiers épars, indiquant la grande taille nominale du fichier et non les blocs plus petits utilisés sur le disque comme les durapports.)
Nelson
1
Contrairement à de nombreuses autres réponses ici qui utilisent à tort l' duutilitaire, cette réponse est correcte. Il est très similaire de répondre ici: unix.stackexchange.com/a/471061/152606 . Mais j'utiliserais ! -type dau lieu de -type fpour compter également les liens symboliques (la taille du lien symbolique lui-même (généralement quelques octets), pas la taille du fichier vers lequel il pointe).
anton_rh
3

Si vous utilisez "du" de busybox dans le système emebedded, vous ne pouvez pas obtenir un octet exact avec du, seulement des Ko que vous pouvez obtenir.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)
Sam Liao
la source
3

Lorsqu'un dossier est créé, de nombreux systèmes de fichiers Linux allouent 4096 octets pour stocker des métadonnées sur le répertoire lui-même. Cet espace est augmenté d'un multiple de 4 096 octets à mesure que le répertoire se développe.

la commande du (avec ou sans l'option -b) prend en compte cet espace , comme vous pouvez le voir en tapant:

mkdir test && du -b test

vous aurez un résultat de 4096 octets pour un répertoire vide. Donc, si vous mettez 2 fichiers de 10000 octets dans le répertoire, le montant total donné par du -sb serait de 24096 octets.

Si vous lisez attentivement la question, ce n'est pas ce qui vous a été demandé. Le questionneur a demandé:

la somme totale de toutes les données dans les fichiers et sous-répertoires que j'obtiendrais si j'ouvrais chaque fichier et comptais les octets

que dans l'exemple ci-dessus doit être de 20000 octets, et non de 24096.

Ainsi, la réponse correcte à mon humble avis pourrait être un mélange de réponse de Nelson et de suggestion hlovdal pour gérer les noms de fichiers contenant des espaces:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
bytepan
la source
2

Il y a au moins trois façons d'obtenir la «somme totale de toutes les données des fichiers et sous-répertoires» en octets qui fonctionnent à la fois sous Linux / Unix et Git Bash pour Windows, répertoriées ci-dessous dans l'ordre du plus rapide au plus lent en moyenne. Pour votre information, ils ont été exécutés à la racine d'un système de fichiers assez profond ( docrootdans une installation Magento 2 Enterprise comprenant 71.158 fichiers dans 30.027 répertoires).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Ces deux méthodes fonctionnent également, mais elles reposent sur des commandes qui n'existent pas sur Git Bash pour Windows:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Si vous ne voulez que le total du répertoire actuel, ajoutez -maxdepth 1à find.


Notez que certaines des solutions suggérées ne renvoient pas de résultats précis, je m'en tiendrai donc aux solutions ci-dessus.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
thdoan
la source
1
En ce qui concerne Git Bash pour Windows, - dans le cas de Cygwin, dcfait partie du bcpackage, donc pour l'obtenir,dc il est nécessaire d'installer bc.
ruvim
1

Pour Win32 DOS, vous pouvez:

c:> dir / sc: \ répertoire \ vous \ voulez

et l'avant-dernière ligne vous dira combien d'octets les fichiers prennent.

Je sais que cela lit tous les fichiers et répertoires, mais fonctionne plus rapidement dans certaines situations.

Soleil
la source
1

duest pratique, mais findest utile dans le cas où vous souhaitez calculer la taille de certains fichiers uniquement (par exemple, en utilisant le filtre par extension). Notez également findqu'ils peuvent eux - mêmes imprimer la taille de chaque fichier en octets. Pour calculer une taille totale, nous pouvons connecter la dccommande de la manière suivante:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Ici findgénère une séquence de commandes dcsimilaires 123 + 456 + 11 +. Cependant, le programme terminé devrait être comme 0 123 + 456 + 11 + p(rappelez-vous la notation postfixe).

Donc, pour obtenir le programme terminé, nous devons mettre 0sur la pile avant d'exécuter la séquence à partir de stdin, et imprimer le nombre supérieur après l'exécution (la pcommande à la fin). Nous y parvenons via des dcoptions:

  1. -e0est juste un raccourci pour -e '0'cela met 0sur la pile,
  2. -f-est pour lire et exécuter les commandes de stdin (celles générées par findici),
  3. -epest pour imprimer le résultat ( -e 'p').

Pour imprimer la taille en MiB comme 284.06 MiBnous pouvons utiliser -e '2 k 1024 / 1024 / n [ MiB] p'au point 3 à la place (la plupart des espaces sont facultatifs).

ruvim
la source
1

Cela peut aider:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

La commande ci-dessus totalisera tous les fichiers quittant la taille des répertoires.

Ataul Haque
la source
1
Notez que cette solution est très similaire à la réponse de Barun. Mais cette solution ne fait pas la somme des fichiers dans les sous-répertoires.
ruvim
1
@ruvim, il ne fait pas non plus la somme des fichiers cachés. Pour additionner les fichiers cachés, l' -Aoption doit être ajoutée à ls.
anton_rh
0

Utilisation:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Où <DIR> est le répertoire que vous souhaitez inspecter.

Le «-c» vous donne le grand total des données qui sont extraites à l'aide de la partie «grep total» de la commande, et le décompte en Ko est extrait avec la commande awk.

La seule mise en garde ici est que si vous avez un sous-répertoire contenant le texte "total", il sera également craché.

Rob Jones
la source