Bu sorunun zaten burada bir cevabı var:
Bir Linux veya Mac OS X dizinindeki tüm dosyaların boyutunu (tekrarlı olarak) bulmak için hangi komutu kullanırım?
Bu sorunun zaten burada bir cevabı var:
Bir Linux veya Mac OS X dizinindeki tüm dosyaların boyutunu (tekrarlı olarak) bulmak için hangi komutu kullanırım?
Yanıtlar:
duOS X'te kullanılan BSD sürümü, 512 baytlık bloklarla boyutu bildirir - boyutlar temel olarak bir sonraki 512 bayt değerine yuvarlanır. Bu, diskte bulunan ve veri miktarından daha büyük olan alanı gösterir. Çok sayıda küçük dosyanız varsa, fark büyük olabilir.
İşte bir örnek.
Bu normal olan değerdir du. 512 baytlık bloklar halinde:
$ du -s
248 .
-hKilobayt daha okunabilir bir dizi bayrak sonuçları. Beklendiği gibi, 512 baytlık blok sayısının yarısı:
$ du -hs
124K .
Son olarak, dosyalardaki gerçek baytların toplamını vermek için kullanabilir findve kullanabilirsiniz awk. Bu biraz yavaş ama işe yarıyor:
$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527
Bu değer, Finder'ın Bilgi Al penceresi tarafından bildirilen sayı ile tam olarak eşleşir. (Bu dosya grubunda tuhaf çatal veya xattr yok.) Tarafından bildirilen değerden çok daha küçük du.
İşte nasıl çalıştığını: tüm dosyaların bir listesini alır ve onları iletir ls -l; daha sonra awkbaytları saymak için kullanılır. -type fYalnızca dosyaları (ve dizinleri) gönderilen olsun ki bayrak var ls. Bu bayrak olmadan, aynı zamanda dizin isimlerini de gönderir lsve her bir dosya iki kere listelenir: bir defa ayrı bir dosya olarak ve bir defa da dizinde bir öğe olarak.
GNU sürümü dubloklar yerine gerçek bayt cinsinden değerler verebilir. BSD versiyonunun duesnek olması talihsizlik .
duolan GNU coreutils kullanıldığında , borunuzdan -bfarklı bir sonuç alıyorum find. 36 GB'lık bir dizin için 82 KB'lık bir fark alıyorum.
Tek bir dosyanın boyutunu göster
du -h path_to_a_file
Bir dizinin içeriğini, her bir alt dizini ve her bir dosyanın boyutunu göster:
du -h path_to_a_directory
Bir dizinin içeriğinin boyutunu göster:
du -sh path_to_a_directory
du -schdaha kolay okunabilen bir şey istiyorsanız.
du - diskin dosya boyutunu değil kullanmasını söyler .
find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'
terminal kodunun yukarısındaki (osx 10.6 im) benim için en iyi sonucu sunar ve "find ... -exec" den daha hızlıdır.
hızlı bir kriter
time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970
real 0m0.086s
user 0m0.029s
sys 0m0.073s
time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970
real 0m18.515s
user 0m2.929s
sys 0m9.339s
find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Sen kullanabilirsiniz du -ah .ardışık tüm dosyaları ve dizinleri boyutlarını görüntüler hangi.
Bu, birleştirilebilir sort, böylece geçerli klasördeki en büyük 20 dizini görürsünüz:
du -ah . | sort -rh | head -20
Not: Seçenek -hiçin sortOSX / BSD kullanılamaz, yüklemek ettik böylece sortdan coreutils(örn aracılığıyla brew) ve bin yolunu uygulamak PATH, örneğin
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Aksi takdirde kullanım:
du -a . | sort -rn | head -20
brew install coreutilsaksi halde sonunda BSD sort komutunu kullanın -h.
Tüm yaklaşımlarını birleştirdim ve sonuçları okunabilir bir çıktıyla birleştirdim, sonuç şu:
#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'
Ana fikir bağlantı: https://gist.github.com/mlegenhausen/9365461
-k1K baytlık blok boyutunu kullanma seçeneğini kullanabilirsiniz