Bash'de klasör boyutunu kontrol edin


317

Bir dizin boyutunu hesaplayacak bir komut dosyası yazmaya çalışıyorum ve boyutu 10GB'den küçükse ve 2GB'den büyükse bazı eylemler yapın. Klasör adımı nerede belirtmem gerekir?

# 10GB
SIZE="1074747474"

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

1
Ve sıralamak isterseniz: serverfault.com/questions/62411/…
cregox


Bu popüler bir soru olduğu için - Yeni başlayanlar bu sorunun cevaplarıyla karşılaşıyorsa ve halkanın ne duolduğu ve herkesin tüm bu komutları nasıl bildikleri hakkında daha fazla bilgi edinmek istiyorsa : man duKılavuzda du komutunu aramak için terminalinize yazabilirsiniz . Bu, görüntüleyebileceğiniz bir çıktı görüntüler ve cevapları kullanmanızı önerdiğiniz cevaplar olan -h, -c, -s, -b, -B, --parmagen boyutunda vb. Tüm bayrakları özetler. Ardından, duözel kullanım durumunuz için en iyi nasıl kullanmak istediğinize kendiniz karar verebilirsiniz .
Josh Desmond

Yanıtlar:


609

Yapabilirsin:

du -h your_directory

hedef dizininizin boyutunu verir.

Kısa bir çıktı istiyorsanız du -hcs your_directory, güzel.


15
Bir komut dosyası için değer elde etmeye çalıştığınızda okunabilir rakamlar istemezsiniz.
Çeltik

4
Herhangi bir dizin yolu belirtilmediğinde, varsayılan olarak geçerli çalışma dizinine ayarlanır. yani du -hs== du -hs ..
razz

8
Ayrıca kontrol edin: du | sort -ndizinleri boyutuna göre
sıralar

3
du -hcs dir_name/*alt klasörleri içerir
optimiertes

du -h <dir> | kuyruk -1?
Alexander Mills

143

yalnızca alt klasörleri değil klasör boyutunu görmek istiyorsanız şunları kullanabilirsiniz:

du -hs /path/to/directory

Güncelleme:

duKullanılan disk alanını gösterdiğini bilmelisiniz ; ve dosya boyutunu değil.

--apparent-sizeU gerçek dosya boyutlarının toplamını görmek istiyorsanız kullanabilirsiniz .

--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

Ve elbette -hbir senaryoda (İnsan tarafından okunabilir) seçeneğe gerek yoktur .

Bunun yerine -bkomut dosyası içinde daha kolay karşılaştırma için kullanabilirsiniz .

Ancak bunun tek başına -buygulandığını not etmelisiniz --apparent-size. Ve ihtiyacınız olan şey olmayabilir.

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

Bence bu yüzden, kullanmak gerekir --block-sizeveya-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

Birkaç yıl geçtiğini biliyorum, ama şartlı ifadelerde regex ve BASH_REMATCH'in amacı nedir biraz açıklayacak kadar nazik misiniz? (veya bu değişkenlerin / komutların / biçimlerin kullanımına ilişkin bazı bağlantılar sağlamak için) Ben kod sadece bir değişken dosya boyutunu almak ve 10 gb ile doğrudan karşılaştırmak, bu diğer şeyler neler yapıyor karşılaştırmak olurdu?
Nordico

2
@Nordico yup. regex ve BASH_REMATCH gerek yoktu, bu yüzden cevabı güncelledim.
Taxellool

29

Bir özet ( -s) ve bayt ( -b) kullanın. Özetin ilk alanını ile kesebilirsiniz cut. Hepsini bir araya koy:

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

1
Komut dosyası oluşturmada yeniyim. Du komutunun çıktısı dizin adını içeriyordu. Sadece bir numara parçası alamadım. Cevabında "kes" gizemi çözdü!
simpleDev

26

Sadece dizinin boyutunu almak için, başka bir şey yok:

du --max-depth=0 ./directory

çıktı benziyor

5234232       ./directory

5
--max-depthÇıktıyı kontrol etmek için çok kullanışlıdır! örneğin, bir dizinde neler olup du -h --max-depth=1
bittiğiyle


12

yalnızca klasörün toplam boyutunu ve muhtemelen MB veya GB biçiminde görmek istiyorsanız, lütfen aşağıdaki komut dosyasını deneyin

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

1
os x'de bayraklar -g1-Gbyte ve -m1-Mbyte sayımı içindir. 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

Eğer yardımcı olursa, .bashrcveya öğenizde bir takma ad da oluşturabilirsiniz .bash_profile.

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

Bu, geçerli dizinin boyutunu veya bağımsız değişken olarak geçirdiğiniz dizini yazdırır.


Bu harika bir cevap
d8aninja
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.