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
à M
la source
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.

Mingyu
la source
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
Taxellool
la source
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)
paddy
la source
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
siliconrockstar
la source
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
15

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

du -h --max-depth=1

Michael Silverstein
la source
5
ou du -h -d 1sur android.
jiggunjer
5
et du -h -d 1sur OSX
Mike W
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/
Shivraaz
la source
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
Gutz-Pilz
la source
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.

Vignesh Raja
la source
C'est une excellente réponse
d8aninja