507 votes

Vérifier la taille du dossier dans Bash

J'essaie d'écrire un script qui va calculer la taille d'un répertoire et si la taille est inférieure à 10GB, et supérieure à 2GB, faire une action. Où dois-je mentionner le nom de mon répertoire ?

# 10GB
SIZE="1074747474"

# check the current size
CHECK="`du /data/sflow_log/`"
if [ "$CHECK" -gt "$SIZE" ]; then
  echo "DONE"
fi

1 votes

Et si vous voulez le trier : serverfault.com/questions/62411/

0 votes

0 votes

Comme il s'agit d'une question populaire, si un débutant rencontre les réponses à cette question et veut en savoir plus sur ce qu'est l'enfer du est et comment tout le monde connaît toutes ces commandes : Vous pouvez taper man du dans votre terminal pour rechercher la commande du dans le manuel. Cela affichera une sortie que vous pouvez visualiser, et résumera tous les drapeaux comme -h, -c, -s, -b, -B, --apparent-size, etc. que les réponses vous suggèrent d'utiliser. Ensuite, vous pourrez décider par vous-même de la meilleure façon d'utiliser du pour votre cas d'utilisation spécifique.

950voto

Mingyu Points 3874

Vous pouvez le faire :

du -hs your_directory

qui vous donnera un bref aperçu de la taille de votre répertoire cible. En utilisant un caractère de remplacement comme * peut sélectionner plusieurs répertoires.

Si vous souhaitez obtenir une liste complète des tailles de tous les fichiers et sous-répertoires de votre cible, vous pouvez le faire :

du -h your_directory

Conseils :

  • Ajouter l'argument -c pour voir un Total ligne à la fin. Exemple : du -hcs o du -hc .

  • Supprimer l'argument -h pour voir les tailles en KiB exacts au lieu des formats MiB ou GiB lisibles par l'homme. Exemple : du -s o du -cs .

28 votes

Vous ne voulez pas de chiffres lisibles par l'homme lorsque vous essayez d'obtenir une valeur pour un script.

5 votes

Si aucun chemin de répertoire n'est spécifié, le répertoire de travail actuel sera utilisé par défaut. so du -hs == du -hs . .

18 votes

Vérifiez également : du | sort -n il triera les répertoires par leur taille

185voto

Taxellool Points 433

Si vous voulez juste voir la taille du dossier et non les sous-dossiers, vous pouvez utiliser :

du -hs /path/to/directory

Mise à jour :

Vous devez savoir que du indique l'espace disque utilisé, et non la taille du fichier.

Vous pouvez utiliser --apparent-size si vous voulez voir la somme des tailles réelles des fichiers.

--apparent-size
      print  apparent  sizes,  rather  than  disk  usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse')
      files, internal fragmentation, indirect blocks, and the like

Et bien sûr, il n'y a pas besoin de -h (Human readable) à l'intérieur d'un script.

Au lieu de cela, vous pouvez utiliser -b pour faciliter la comparaison à l'intérieur de script.

Mais vous devez noter que -b s'applique --apparent-size par lui-même. Et ce n'est peut-être pas ce dont vous avez besoin.

-b, --bytes
      equivalent to '--apparent-size --block-size=1'

donc je pense que vous devriez utiliser --block-size o -B

#!/bin/bash
SIZE=$(du -B 1 /path/to/directory | cut -f 1 -d "   ")    
# 2GB = 2147483648 bytes
# 10GB = 10737418240 bytes
if [[ $SIZE -gt 2147483648 && $SIZE -lt 10737418240 ]]; then
    echo 'Condition returned True'
fi

1 votes

Je sais que cela fait quelques années, mais auriez-vous l'amabilité d'expliquer un peu à quoi servent les regex et BASH_REMATCH dans les conditionnels ? (Je me serais attendu à ce que le code récupère simplement la taille du fichier dans une variable et la compare directement à 10 gb, à quoi servent ces autres choses ?

2 votes

@Nordico oui. Il n'y avait pas besoin de regex et de BASH_REMATCH donc j'ai mis à jour la réponse.

59voto

Pour vérifier la taille de tous les répertoires à l'intérieur d'un répertoire, vous pouvez utiliser :

du -h --max-depth=1

6 votes

Ou du -h -d 1 sur Android.

9 votes

Et du -h -d 1 sur OSX

40voto

siliconrockstar Points 361

Pour obtenir simplement la taille du répertoire, rien de plus :

du --max-depth=0 ./directory

La sortie ressemble à

5234232       ./directory

9 votes

--max-depth est très utile pour contrôler utilement la sortie ! par exemple, pour avoir une bonne notion de ce qui se passe à l'intérieur d'un répertoire : du -h --max-depth=1

40voto

paddy Points 26183

Utilisez un résumé ( -s ) et des octets ( -b ). Vous pouvez couper le premier champ du résumé avec cut . Tout mettre en place :

CHECK=$(du -sb /data/sflow_log | cut -f1)

4 votes

Je suis nouveau dans le domaine des scripts shell. La sortie de la commande du inclut le nom du répertoire. Je n'ai pas réussi à obtenir uniquement la partie numérotée. Le mot "cut" dans votre réponse a résolu le mystère !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X