Bir Linux veya Mac OS X dizinindeki tüm dosyaların boyutunu (tekrarlı olarak) bulmak için hangi komutu kullanırım?
OS X'te kullanılan du
'nin BSD sürümü, boyutu 512 bayt bloklarla rapor eder - boyutlar esasen 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 du
olan değerdir. 512 baytlık bloklar halinde:
$ du -s
248 .
-h
bayrağı kilobayt cinsinden daha okunaklı bir sayı ile sonuçlanır. 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 find
ve awk
kullanabilirsiniz. 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 yoktur.) du
tarafından bildirilen değerden çok daha küçük.
İşte nasıl çalışır: tüm dosyaların bir listesini alır ve onları ls -l
'a iletir; Daha sonra awk
, baytları saymak için kullanılır. -type f
bayrağı, yalnızca dosyaların (dizinlerin değil) ls
adresine gönderilmesi için oradadır. Bu bayrak olmadan, ayrıca ls
dizin dizinlerini de gönderir ve her dosya iki kez listelenir: bir kez ayrı bir dosya olarak ve bir kez dizinde bir öğe olarak.
du
öğesinin GNU sürümü, bloklar yerine gerçek bayt cinsinden değerler verebilir. Bu du
'nin BSD versiyonunun esnek olmaması talihsiz bir durum.
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 - disk kullanımını değil dosya boyutunu olarak bildirir.
find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'
terminal kodunun üstünde (osx 10.6'da im) benim için en iyi sonucu sunuyor ve "find ... -exec" den daha hızlı çalışıyor
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
Tüm dosya ve dizinlerin boyutlarını tekrarlı olarak gösteren du -ah .
öğesini kullanabilirsiniz.
Bu sort
ile birleştirilebilir, böylece geçerli klasördeki en büyük 20 dizini göreceksiniz:
du -ah . | sort -rh | head -20
Not: sort
için -h
seçeneği OSX/BSD'de mevcut değildir, bu nedenle sort
öğesini coreutils
(örn. brew
aracılığıyla) yüklemeniz ve kutu yolunu PATH
, ör.
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Aksi takdirde kullanım:
du -a . | sort -rn | head -20
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 } }}'
Oyuna Bağlantı: https://Gist.github.com/mlegenhausen/9365461