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:
du
OS 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 .
-h
Kilobayt 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 find
ve 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 awk
baytları saymak için kullanılır. -type f
Yalnızca dosyaları (ve dizinleri) gönderilen olsun ki bayrak var ls
. Bu bayrak olmadan, aynı zamanda dizin isimlerini de gönderir ls
ve her bir dosya iki kere listelenir: bir defa ayrı bir dosya olarak ve bir defa da dizinde bir öğe olarak.
GNU sürümü du
bloklar yerine gerçek bayt cinsinden değerler verebilir. BSD versiyonunun du
esnek olması talihsizlik .
du
olan GNU coreutils kullanıldığında , borunuzdan -b
farklı 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 -sch
daha 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 -h
için sort
OSX / BSD kullanılamaz, yüklemek ettik böylece sort
dan 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 coreutils
aksi 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
-k
1K baytlık blok boyutunu kullanma seçeneğini kullanabilirsiniz