Vérifier la taille du dossier dans Bash


317

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

# 10GB
SIZE="1074747474"

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

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


Puisque c'est une question populaire - Si un débutant rencontre les réponses à cette question et veut en savoir plus sur ce qu'est le diable duet comment tout le monde connaît toutes ces commandes: vous pouvez taper man dudans votre terminal pour rechercher la commande du dans le manuel. Cela affichera une sortie que vous pouvez afficher et résumera tous les indicateurs tels que -h, -c, -s, -b, -B, --apparent-size, etc. que les réponses suggèrent-vous d'utiliser. Ensuite, vous pouvez décider vous-même de la meilleure façon d'utiliser duvotre cas d'utilisation spécifique.
Josh Desmond

Réponses:


610

Tu peux faire:

du -h your_directory

qui vous donnera la taille de votre répertoire cible.

Si vous voulez une brève sortie, du -hcs your_directoryc'est sympa.


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

4
Sans chemin de répertoire spécifié, il sera par défaut le répertoire de travail actuel. donc du -hs== du -hs ..
razz

8
Consultez également: du | sort -nil
triera

3
du -hcs dir_name/*inclut les sous
optimiertes

du -h <rép> | queue -1?
Alexander Mills du

143

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

du -hs /path/to/directory

Mettre à jour:

Vous devez savoir que cela dumontre l'espace disque utilisé; et non la taille du fichier.

Vous pouvez utiliser --apparent-sizesi vous voulez voir la somme des tailles de fichier réelles.

--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 d' -hoption (lisible par l'homme) dans un script.

Au lieu de cela, vous pouvez utiliser -bpour une comparaison plus facile à l'intérieur du script.

Mais vous devez noter que cela -bs'applique --apparent-sizepar 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-sizeou-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

Je sais que cela fait quelques années, mais seriez-vous assez aimable pour expliquer un peu quel est le but des expressions régulières et BASH_REMATCH dans les conditions? (ou pour fournir des liens sur l'utilisation de ces variables / commandes / formats) Je m'attendais à ce que le code obtienne simplement la taille du fichier dans une variable et la compare directement avec 10 Go, que font ces autres choses?
Nordico

2
@Nordico yup. il n'y avait pas besoin de regex et BASH_REMATCH donc j'ai mis à jour la réponse.
Taxellool

29

Utilisez un résumé ( -s) et des octets ( -b). Vous pouvez couper le premier champ du résumé avec cut. Mettre tous ensemble:

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

1
Je suis nouveau dans les scripts shell. La sortie de la commande du nom de répertoire inclus. Je n'ai pas pu obtenir seulement la partie numérique. "couper" dans votre réponse a résolu le mystère!
simpleDev

26

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

du --max-depth=0 ./directory

la sortie ressemble

5234232       ./directory

5
--max-depthest très utile pour contrôler utilement la sortie! par exemple, pour avoir une bonne idée de ce qui se passe dans un répertoire:du -h --max-depth=1
matanster


12

si vous voulez juste voir la taille globale du dossier et probablement au format MB ou GB, essayez le script ci-dessous

$du -s --block-size=M /path/to/your/directory/

1
sur os x, les indicateurs sont -gpour les décomptes -mde 1 Go et pour les décomptes de 1 Mo. viaman du
Sgnl

5
# 10GB
SIZE="10"


# check the current size
CHECK="`du -hs /media/662499e1-b699-19ad-57b3-acb127aa5a2b/Aufnahmen`"
CHECK=${CHECK%G*}
echo "Current Foldersize: $CHECK GB"

if (( $(echo "$CHECK > $SIZE" |bc -l) )); then
        echo "Folder is bigger than $SIZE GB"
else
        echo "Folder is smaller than $SIZE GB"
fi

4

Si cela peut vous aider, vous pouvez également créer un alias dans votre .bashrcou .bash_profile.

function dsize()
{
    dir=$(pwd)
    if [ "$1" != "" ]; then
            dir=$1
    fi
    echo $(du -hs $dir)
}

Cela affiche la taille du répertoire actuel ou du répertoire que vous avez passé en argument.


C'est une excellente réponse
d8aninja
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.