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


74

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


2
-k1K baytlık blok boyutunu kullanma seçeneğini kullanabilirsiniz
Zoker

Sadece Disk Envanteri X adlı bu ücretsiz yazılımı tavsiye etmek istiyorum. Buradan indirin derlien.com mac osx için kullanımı basit
Nimitack

Yerine du, kullandığım ncdu, buradan başvuru bulabilirsiniz, remysharp.com/2018/08/23/cli-improved
Alan dong

Yanıtlar:


82

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 .


Harika bir açıklama. İlginç bir seçenek 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.
Stefan Schmidt,

Bunu daha okunaklı bir biçimde yazdırmanın bir yolu var mı?
anon58192932

75

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


25
du -schdaha kolay okunabilen bir şey istiyorsanız.
Joey

@Johannes, bu yorumu bir cevap olarak göndermelisiniz, bu nedenle kabul edilebilir mi?
Arjan

-C seçeneğini gereksiz buluyorum (en azından Mac OS X'te) ve du -sh alt toplamları bastırıyor.
Daryl Spitzer,

Aha, birinin kendi cevabını kabul edebileceğini bilmiyordum. Şimdi en azından insanlar sorunun çözüldüğünü biliyor.
Arjan

Benim için bir gelişme olan yeni bir cevabı mutlu bir şekilde kabul edeceğim.
Daryl Spitzer

9

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

Aynı şeyi Ubuntu'da da yapmak istiyorsanız:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo

bu sonucu insan tarafından okunabilir bir biçimde almanın bir yolu var mı?
anon58192932

5

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

İlk komut benim macOS'umda çalışmıyor 10.12.1 #du -ah. | sıralama -rh | head -20 sort: invalid option - h Daha fazla bilgi için `sort --help 'komutunu deneyin.
nucleartux

2
@ nucleartux Komutun altındaki notu kontrol et. Bu, macOS'a aşağıdakileri kullanarak yükleyebileceğiniz GNU türünde çalışır: brew install coreutilsaksi halde sonunda BSD sort komutunu kullanın -h.
kenorb 24:16

2

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

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.