web-dev-qa-db-fra.com

Taille totale du contenu de tous les fichiers d'un répertoire

Lorsque j'utilise ls ou 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 des sous-répertoires que je recevrais si j'ouvrais chaque fichier et comptais les octets. Des points bonus si je peux obtenir cela sans ouvrir chaque fichier et compter.

93
Arthur Ulfeldt

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

% du -sbh <directory>
100
Arkady

Utilisez du -sb:

du -sb DIR

Ajoutez éventuellement l'option h pour une sortie plus conviviale:

du -sbh DIR
44
rob

cd dans le répertoire, puis:

du -sh

ftw!

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

24
Andrew Odendaal

Juste une alternative:

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

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

15
Barun

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 additionner des nombres .

10
Nelson

Si vous utilisez busybox "dans un système embarqué, vous ne pouvez pas obtenir d'octets exacts avec du, mais seulement des kilo-octets.

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)
3
Sam Liao

Il existe au moins trois manières d'obtenir le "total total de toutes les données dans les fichiers et sous-répertoires" en octets qui fonctionnent à la fois sous Linux/Unix et Git Bash pour Windows, répertoriés ci-dessous par ordre croissant. Pour votre information, elles ont été exécutées à la racine d'un système de fichiers assez profond (docroot dans une installation de 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 fonctionnent également, mais ils 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 souhaitez uniquement le total du répertoire en cours, ajoutez -maxdepth 1 à find.


Notez que certaines des solutions suggérées ne renvoient pas de résultats précis, je me contenterais donc des 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
2
thdoan

du est pratique, mais find est utile si vous souhaitez calculer la taille de certains fichiers uniquement (par exemple, en utilisant le filtre par extension). Notez également que find peut imprimer la taille de chaque fichier en octets. Pour calculer une taille totale, nous pouvons connecter la commande dc de la manière suivante:

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

Ici, find génère une séquence de commandes pour dc comme 123 + 456 + 11 +. Bien que, le programme terminé devrait ressembler à 0 123 + 456 + 11 + p (rappelez-vous la notation postfixe).

Donc, pour obtenir le programme terminé, nous devons mettre 0 sur la pile avant d'exécuter la séquence à partir de stdin et imprimer le premier chiffre après avoir exécuté (la commande p à la fin). Nous y parvenons via les options dc

  1. -e0 est juste un raccourci pour -e '0' qui place 0 sur la pile,
  2. -f- est pour lire et exécuter des commandes de stdin (celui généré par find ici),
  3. -ep est pour imprimer le résultat (-e 'p').

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

1
ruvim

Cela peut aider:

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

La commande ci-dessus additionnera tous les fichiers en laissant la taille des répertoires.

1
Ataul Haque

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

du commande (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 10 000 octets à l'intérieur du 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 est demandé. Le questionneur a demandé:

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

que dans l'exemple ci-dessus devrait être 20000 octets, pas 24096.

Ainsi, la bonne réponse à mon humble avis pourrait être un mélange de Nelson answer et de hlovdal suggestion 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}'
1
bytepan

Utilisation:

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

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

Le "-c" vous donne le total général des données qui sont extraites à l'aide de la partie "grep total" de la commande, et le nombre en kilo-octets est extrait avec la commande awk.

Le seul inconvénient est que si vous avez un sous-répertoire contenant le texte "total", il sera également recraché.

0
Rob Jones

Pour le DOS Win32, vous pouvez:

c:> dir/s c:\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.

0
Sun