Dizin boyutu hesaplama farkı


9

İmzalama için terminalde dizin boyutunu almam gerekiyor. Aşağıdaki komutu kullanıyorum:

du -s /path/to/dir

Sonucu geleneksel UNIX blok boyutu (512 bayt) ile çarpıyorum ve bayt cinsinden gerçek dizin boyutu elde ediyorum. Ancak, Finder'ın "Bilgi Al" iletişim penceresi, terminal komutuyla hesaplanandan biraz daha küçük olan boyutu gösterir. Ve herhangi bir klasör / paket üzerinde tekrarlanabilir gibi görünüyor. Neyi kaçırıyorum?

Yanıtlar:


11

Normalde, disk kullanımı (adının geldiği yer) duhakkındaki bilgileri gösterir . Unutmayın

disk usage != sum of file sizes

Çünkü her dosya , dosya sisteminde birkaç blok kaplar ( man mkfs.ext2örneğin, bkz .). Bu, çok nadir bir durumda bir dosyanın disk kullanımının gerçek boyutuna eşit olduğu anlamına gelir - bunun için boyut, blok boyutunun tam olarak bir katı olmalıdır.

Dosya sistemi bloklarını dosyaların bir kısmını içeren kutular olarak düşünün; her biri yalnızca bir dosyanın bir bölümünü içerebilir.

GNU sürümü duiçin --apparent-sizeseçeneği işaretleyin.


Dosya sisteminde seyrek dosyalar olduğunda daha da ilginç bir durum ortaya çıkabilir !


Böyle bir seçenek yok (Linux'ta değil OS X'deyim). Muhtemelen bir soruda, etiket yeterli olmadığından bahsetmek gerekiyordu.)
Eimantas

Ah, doğru ... O zaman man sayfasına bir göz atın ve actualya da referanslarını bulmaya çalışın apparent. (Ayrıca güncellenmiş açıklamama bakın).
rozcietrzewiacz

2
Eşitsizlik dışında doğrudur. Dosya boyutları bazen bunları depolamak için gereken gerçek disk alanından daha büyük olabilir. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez

@ StéphaneGimenez Vay be ... bana söylediğin için teşekkürler!
rozcietrzewiacz

2

Mac OS X ve Finder hakkında (Snow Leopard'da, sürüm 10.6.8) aşağıdakileri fark ettim.

  • bashAşağıdaki kodla (1 ()) bulunan Finder'ın bir yolun (dosya veya klasör) rakamları için bayt sayılarını alıyorum .
  • Finder "Bilgi" pencereleri ve bölmesi, ikili (taban 2, 1024) baytların aksine ondalık (taban 10, 1000) bayt cinsinden "sayısallaştırılmış" (örn. KB cinsinden kilo) rakamlarını gösterir; 1000 ve birim (bayt) öneki 'niceleyici' (büyüklüğü) artırmak ve bazı "kapalı anahtar" yuvarlama yapmak. (Tam kodum, açıklanmamış geliştirme koduyla doludur ve birkaç dosyaya (ve dile) ayrılmıştır, bu yüzden paylaşmak zordur.)
    Gördüğüm kadarıyla 'nicemlenmiş' rakamlarım Finder'daki 'nicelikli' rakamlarla aynı .
  • Ayrıca, kod ile birlikte BLOCKSIZEbenim kabuğundaki hiçbir ortam değişkeni (ve hiç yoktu) söylemek istiyorum ama test (şimdi, biraz) hem sürümleri hem de varsayılan değerleri $BLOCKSIZEaynı değerleri verir.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • Eşleştiremediğim ölçüsüz sayı.
    Söyleyebileceğim tek şey, sadece dosyaları (böylece dizin ~ 'dosya sistemi meta dizini / başlık' ~ veri hariç) sayarak yaklaşmak ve en yakın ben aşağıdaki ile olmasıdır.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Ne (xnu) du(1) ne de (gnu) gdu(1) genişletilmiş özellikleri saymıyor ( xattr)

Sonra ben sadece gerekir pun 'Run yolunu ve matematik'
dışarı Barış ve bu sefer fo'real geceler.


1

Ubuntu sistemimde, ext4 kullanarak, du -b filegerçek bir dosyanın du -b dirbayt cinsinden boyutunu verir ve dosya (lar) + dizin yükünün bayt cinsinden boyutunu verir, Tepegöz, benim durumumda, 4096 baytın katlarıdır.

Bu ek yük, dosya sayısı arttıkça artar.
Not: dosyalar silinse bile, dizin ek yükü dosyalar silinmeden önceki konumunda kalır.

Geri dönüp dönmediğini görmek için yeniden başlatmayı denemedim, ancak her iki durumda da, dizin boyutunun tarihi koşullara bağlı olarak değiştiği anlamına gelir.

Her bir dosya boyutuna karşılık vermek, toplam dosya boyutlarının doğru değeri için en iyi seçenek olabilir .

Aşağıdaki komut dosyası tüm dosya boyutlarını (bayt cinsinden) toplar.

Eğer yoksa OS X için, -b'du' için Opton kullanabileceğiniz statyerine (eğer varsa:) ... yorumladı hat gösterileri Ubuntu. statAlternatif du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

2
OSX'in sahip değildu -b ve farklıstat . Betiğiniz her iki şekilde de Linux dışında taşınabilir değildir.
Gilles 'SO- kötü olmayı kes

OS X'te MacPorts ile as coreutilsGNU sürümünü almak için yükleyebilirsiniz . Bu yüzden tam olarak taşınabilir değil , ancak OS X'deki kişilerin birkaç çekirdek aracın GNU sürümlerini alması için yararlı olabilir. dugdu
drfrogsplat

1

Bir dizindeki tüm dosyaları topla:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'


find: unrecognized: -printf. Alpine image
gadelat
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.