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.
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>
Utilisez du -sb
:
du -sb DIR
Ajoutez éventuellement l'option h
pour une sortie plus conviviale:
du -sbh DIR
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/
Juste une alternative:
ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
grep -v '^d'
exclura les répertoires.
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 .
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)
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
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
:
-e0
est juste un raccourci pour -e '0'
qui place 0
sur la pile,-f-
est pour lire et exécuter des commandes de stdin (celui généré par find
ici),-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).
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.
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}'
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é.
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.