Bir dizindeki tüm dosyaların içeriğinin toplam boyutu [kapalı]


103

lsVeya kullandığımda du, her dosyanın kapladığı disk alanı miktarını alıyorum.

Her dosyayı açıp baytları sayarsam alacağım dosyalardaki ve alt dizinlerdeki tüm verilerin toplamına ihtiyacım var. Her dosyayı açmadan ve saymadan bunu alabilirsem bonus puan.


1
lsaslında disk alanı miktarını değil, her dosyadaki bayt sayısını gösterir. Bu ihtiyaçlarınız için yeterli mi?
Greg Hewgill

3
duBu soruyu yanıtlamak için kullanılamayacağını unutmayın . Dizinin diskte kapladığı disk alanı miktarını (dosyaların verileri artı yardımcı dosya sistemi meta bilgilerinin boyutu) gösterir. duÇıktı tüm dosyaların toplam boyutu daha küçük olabilir. Bu, dosya sistemi diskte sıkıştırılmış verileri depolayabiliyorsa veya sabit bağlantılar kullanılıyorsa olabilir. Doğru cevaplar dayanmaktadır lsve find. Nelson ve bytepan tarafından verilen yanıtları burada veya bu yanıtı görün: unix.stackexchange.com/a/471061/152606
anton_rh

Yanıtlar:


108

Diskteki dosyaların kapladığı boyutu değil de (her dosyadaki bayt sayısıdır) 'görünen boyutu' istiyorsanız, -bveya --bytesseçeneğini kullanın (GNU çekirdek işlevlerine sahip bir Linux sisteminiz varsa ):

% du -sbh <directory>

1
yeni kırmızı şapka kutularımda çalışıyor, ne yazık ki yerleşik Dev kutumda değil.
Arthur Ulfeldt

3
"Görünen boyutu" insan tarafından okunabilir formatta göstermenin kolay bir yolu var mı? Kullanırken du -shb(bu cevapta önerildiği gibi), -bayar , ayarı geçersiz kılıyor gibi görünüyor -h.
Mathias Bynens

6
@MathiasBynens Bayrakların sırasını tersine çevirin (yani du -sbh <dir>). Benim için çalışıyor.
Luis E.

2
@MathiasBynensdu -sh --apparent-size /dir/
Jongosi

2
@Arkady Çözümünüzü CentOS ve Ubuntu'da denedim ve küçük bir hata var. "Du -sbh" istiyorsun. "-H" bayrağı en son gelmelidir.
theJollySin

46

Kullanım du -sb:

du -sb DIR

İsteğe bağlı olarak, hdaha kullanıcı dostu çıktı için seçenek ekleyin :

du -sbh DIR

4
-b, MacOS 'du
lynxoid

3
@lynxoid: GNU sürümünü brew: ile kurabilirsiniz brew install coreutils. Komut olarak mevcut olacaktır gdu.
neu242

1
Çalışmıyor. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Kesinlikle içeriğin toplam boyutu değil, dizinin diskte kapladığı boyuttur.
anton_rh

24

dizine cd, ardından:

du -sh

ftw!

İlk olarak burada yazmıştı: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/


1
Bu basit ve işe yarıyor! Teşekkürler. Bazen -Lseçeneği eklemeyi severim, böylece dusembolik bağları takip ederim .
conradkleinespel

2
benim için çalışıyor (OS X'te)
sam boosalis

2
Bu basit ve çalışmıyor. Her dosya açılarak ve baytları sayarak hesaplanabilen içeriğin toplam boyutunu değil, dizinin diskte kapladığı alanı yazdırır.
anton_rh

17

Sadece bir alternatif:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' dizinleri dışlayacaktır.


4
Mükemmel, ayrıca "gizli dosyaları" (noktayla başlayan herhangi bir şey) almak için -a parametresini ekleyin
Nicholi

Belirli bir dosya türüne (bu durumda PNG) izole edilmiş ve daha fazla okunabilirlik için MB olarak ifade edilmiştir: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice

Bu doğru bir cevap. duBu çözümden farklı olarak, dosyalardaki tüm verilerin toplam boyutunu, sanki birer birer açılmış ve baytları sayılmış gibi sayar. Ancak evet, -Agizli dosyaları da saymak için parametrenin eklenmesi gerekir.
anton_rh

13

stat'ın "% s" biçimi size bir dosyadaki gerçek bayt sayısını verir.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Sayıları toplamak için en sevdiğiniz yöntemi kullanmaktan çekinmeyin .


4
Belirli dosya adlarıyla (boşluklar içeren) sorunları önlemek için tercihen "find. -Type f -print0 | xargs -0 ..." kullanın.
hlovdal

1
evet, iyi nokta. bsd 4.2'de olmasaydı, kullanmayı hatırlamıyorum :-(
Nelson

3
find -print0ve xargs -0boşluk içeren dosya adları için gereklidir. OS X istiyor stat -f %z.
Kornel

1
(İstatistiğin seyrek dosyalarla çalıştığını ve diskte kullanılan duraporlar gibi daha küçük blokları değil dosyanın büyük nominal boyutunu bildirdiğini unutmayın.)
Nelson

1
Yanlışlıkla duyardımcı programı kullanan diğer birçok yanıtın aksine , bu yanıt doğrudur. Burada cevap vermek çok benzer: unix.stackexchange.com/a/471061/152606 . Ama ! -type dbunun yerine -type fsembolik bağları da saymak için kullanırdım ( sembolik bağın boyutu (genellikle birkaç bayt), işaret ettiği dosyanın boyutu değil).
anton_rh

3

Gömülü sistemde busybox's "du" kullanırsanız, du ile kesin bir bayt elde edemezsiniz, sadece Kbyte alabilirsiniz.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)

3

Bir klasör oluşturulduğunda, birçok Linux dosya sistemi, dizinin kendisiyle ilgili bazı meta verileri depolamak için 4096 bayt ayırır. Bu alan, dizin büyüdükçe 4096 bayt katları artar.

du komutu (-b seçeneği olsun veya olmasın) yazarken görebileceğiniz gibi bu boşluğu sayın :

mkdir test && du -b test

boş bir dizin için 4096 baytlık bir sonuca sahip olacaksınız. Yani, dizinin içine 10000 baytlık 2 dosya koyarsanız, du -sb tarafından verilen toplam miktar 24096 bayt olur.

Soruyu dikkatlice okursanız, sorulan bu değildir. Soru soran şu soruyu sordu:

dosya ve alt dizinlerdeki tüm verilerin toplamı, her dosyayı açıp baytları sayarsam alacağım

yukarıdaki örnekte 24096 değil 20000 bayt olmalıdır.

Dolayısıyla, doğru yanıt IMHO, boşluk içeren dosya adlarını işlemek için Nelson yanıtı ve hlovdal önerisinin bir karışımı olabilir :

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'

2

Hem Linux / Unix hem de Windows için Git Bash'de çalışan bayt cinsinden "dosyalardaki ve alt dizinlerdeki tüm verilerin toplamını" almanın en az üç yolu vardır ve aşağıda en hızlıdan en yavaşa ortalamada sıralanmıştır. Referansınız için, oldukça derin bir dosya sisteminin kökünde yürütüldüler ( docroot30.027 dizinde 71.158 dosyadan oluşan bir Magento 2 Enterprise kurulumunda).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Bu ikisi de çalışır, ancak Windows için Git Bash'de bulunmayan komutlara güvenirler:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Eğer yalnızca geçerli dizinin toplam istiyorsan, o zaman eklemek -maxdepth 1için find.


Önerilen çözümlerden bazılarının doğru sonuçlar vermediğini unutmayın, bu yüzden bunun yerine yukarıdaki çözümlere bağlı kalırım.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133

1
Windows için Git Bash ile ilgili olarak, Cygwin söz konusu olduğunda dc, bcpaketin bir parçasıdır , bu yüzden onu almakdc için yüklemeniz gerekir bc.
ruvim

1

Win32 DOS için şunları yapabilirsiniz:

c:> dir / sc: \ dizin \ istediğiniz \

ve sondan bir önceki satır, dosyaların kaç bayt kapladığını size söyleyecektir.

Bunun tüm dosyaları ve dizinleri okuduğunu biliyorum, ancak bazı durumlarda daha hızlı çalışıyor.


1

dukullanışlıdır, ancak findyalnızca bazı dosyaların boyutunu hesaplamak istiyorsanız kullanışlıdır (örneğin, uzantıya göre filtreleme kullanarak). Ayrıca find, her dosyanın boyutunu bayt cinsinden yazdırabileceklerini unutmayın . Toplam boyutu hesaplamak için dckomutu aşağıdaki şekilde bağlayabiliriz :

find . -type f -printf "%s + " | dc -e0 -f- -ep

Burada findiçin komutlar dizisi üretir dcgibi 123 + 456 + 11 +. Bununla birlikte, tamamlanan program şöyle olmalıdır 0 123 + 456 + 11 + p(sonek gösterimini unutmayın).

Bu yüzden, tamamlanmış programı elde etmek 0için diziyi stdin'den çalıştırmadan önce yığına koymamız ve çalıştırdıktan sonra en üst sayıyı ( psondaki komut) yazdırmamız gerekir . Bunu dcseçeneklerle başarıyoruz:

  1. -e0Sadece için kısayol olan -e '0'bu koyar 0yığın,
  2. -f-stdin'den ( findburada oluşturulan ) komutları okumak ve yürütmek içindir ,
  3. -epsonucu yazdırmak içindir ( -e 'p').

MiB'de boyutu yazdırmak için, bunun yerine 3. maddede 284.06 MiBkullanabileceğimiz gibi -e '2 k 1024 / 1024 / n [ MiB] p'(çoğu boşluk isteğe bağlıdır).


1

Bu yardımcı olabilir:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Yukarıdaki komut, dizinlerin boyutunu bırakarak tüm dosyaların toplamını alacaktır.


1
Bu çözümün Barun'un cevabına çok benzediğini unutmayın . Ancak bu çözüm, alt dizinlerdeki dosyaları toplamaz.
ruvim

1
@ruvim, gizli dosyaları da toplamaz. Gizli dosyaları toplamak için -Aseçeneğin eklenmesi gerekir ls.
anton_rh

0

Kullanım:

$ du -ckx <DIR> | grep total | awk '{print $1}'

<DIR> incelemek istediğiniz dizindir.

'-C', komutun 'grep toplam' kısmı kullanılarak çıkarılan genel toplam veriyi verir ve Kbayt'taki sayım awk komutuyla çıkarılır.

Buradaki tek uyarı, "toplam" metnini içeren bir alt dizine sahipseniz, onun da tükeneceğidir.

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.