it-swarm.asia

Bir Linux veya Mac OS X dizininin boyutunu komut satırından nasıl alabilirim?

Bir Linux veya Mac OS X dizinindeki tüm dosyaların boyutunu (tekrarlı olarak) bulmak için hangi komutu kullanırım?

70
Daryl Spitzer

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.

79
wch

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

75
Daryl Spitzer

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

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

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

2
malte