Comment obtenir la taille réelle du répertoire à l'aide des outils standard UNIX / Linux?
Question alternative: Comment puis-je obtenir du pour me montrer la taille réelle du répertoire (pas l'utilisation du disque)?
Puisque les gens semblent avoir des définitions différentes du terme "taille": Ma définition de "taille de répertoire" est la somme de tous les fichiers réguliers dans ce répertoire.
Je ne me soucie PAS de la taille de l'inode du répertoire ou quoi que ce soit (blocs * taille de bloc) que les fichiers occupent sur le système de fichiers respectif. Un répertoire avec 3 fichiers, 1 octet chacun, a une taille de répertoire de 3 octets (selon ma définition).
Le calcul de la taille du répertoire à l'aide de du semble peu fiable.
Par exemple, mkdir foo && du -b foo
signale "4096 foo", 4096 octets au lieu de 0 octet. Avec de très gros répertoires, la taille du répertoire signalée par du -hs
peut être réduite de 100 Go (!) Et plus (système de fichiers compressé).
Alors, quel (outil / option) doit être utilisé pour obtenir la taille réelle du répertoire?
xfs
par hasard?Réponses:
Voici un script affichant une taille de répertoire lisible par l'homme à l'aide des outils standard Unix (POSIX).
par exemple:
la source
ls
invocations ici:-q
. Sans cette option, le script se brisera si un nom de fichier contient des caractères de nouvelle ligne. Écrire des scripts shell vraiment fiables est trop difficile…Certaines versions de
du
prennent en charge l'argument--apparent-size
pour afficher la taille apparente au lieu de l'utilisation du disque. Votre commande serait donc:À partir des pages de manuel pour du incluses avec Ubuntu 12.04 LTS:
la source
Juste une alternative, en utilisant
ls
:ls -nR
:-n
comme-l
, mais liste les UID et GID numériques et-R
répertorie les sous-répertoires de manière récursive.grep -v:
Inversez le sens de l'appariement pour sélectionner des lignes non appariées. (-v est spécifié par POSIX.).'^ d'
exclura les répertoires.Commande Ls: http://linux.about.com/od/commands/l/blcmdl1_ls.htm
Man Grep: http://linux.die.net/man/1/grep
ÉDITER :
Édité comme suggestion @ Sergey Vlasov.
la source
-n
option pourls
au lieu de-l
(afficher les numéros UID / GID au lieu des noms) est plus sûre, car les noms d'utilisateur et de groupe peuvent contenir des espaces (par exemple, siwinbind
ousssd
est utilisé pour joindre le système à un domaine Windows, vous pouvez obtenir des noms de groupe commedomain users
) . Il devrait également être plus rapide car il n'est pas nécessaire de rechercher les noms d'utilisateurs et de groupes.En supposant que vous avez
du
de GNU coreutils, cette commande devrait calculer la taille apparente totale du nombre arbitraire de fichiers normaux dans un répertoire sans aucune limite arbitraire sur le nombre de fichiers:Ajoutez l'
-l
optiondu
s'il y a des fichiers liés en dur et que vous souhaitez compter chaque lien en dur séparément (par défautdu
compte plusieurs liens durs qu'une seule fois).La différence la plus importante avec plain
du -sb
est que récursifdu
compte également les tailles de répertoires, qui sont rapportées différemment par les différents systèmes de fichiers; pour éviter cela, lafind
commande est utilisée pour transmettre uniquement les fichiers normaux àdu
. Une autre différence est que les liens symboliques sont ignorés (s'ils doivent être comptés, lafind
commande doit être ajustée).Cette commande consommera également plus de mémoire que plain
du -sb
, car l'utilisation des--files0-from=FILE
marques dedu
périphérique de stockage et d'inode de tous les dossiers traités, par opposition au comportement par défaut de se rappeler que les fichiers avec plus d'un lien dur. (Ce n'est pas un problème si l'-l
option est utilisée pour compter plusieurs fois les liens durs, car la seule raison de stocker les numéros de périphérique et d'inode est d'ignorer les fichiers liés durement qui avaient déjà été traités.)Si vous souhaitez obtenir une représentation lisible par l'homme de la taille totale, ajoutez simplement l'
-h
option (cela fonctionne car elledu
n'est invoquée qu'une seule fois et calcule la taille totale elle-même, contrairement à d'autres réponses suggérées):ou (si vous craignez que certains effets de
-b
soient ensuite remplacés par-h
)la source
-b
puisse probablement être remplacé par-A -B 1
, il n'y a pas d'équivalent pour--files0-from=-
, et l'utilisationxargs
nécessitera quelques solutions de contournement au cas où la liste des fichiers serait plus grande queARG_MAX
(et une solution externe pour une sortie lisible par l'homme).Si tout ce que vous voulez est la taille des fichiers, à l'exclusion de l'espace occupé par les répertoires, vous pouvez faire quelque chose comme
@SergeyVlasov a souligné que cela échouera si vous avez plus de fichiers que
argmax
. Pour éviter cela, vous pouvez utiliser quelque chose comme:la source
xargs
, invoqueradu
plusieurs fois, et chaque invocation affichera le grand total juste pour sa part de la liste complète des fichiers,tail
affichera alors uniquement la taille totale de la dernière partie.