Dizin listesindeki dosya boyutlarının toplamını göster


71

Windows dirdizin listesi komutunun sonunda, listelenen dosyaların aldığı toplam alan miktarını gösteren bir satır var. Örneğin , geçerli dizindeki dir *.exetüm .exedosyaları, boyutlarını ve boyutlarının toplamını gösterir. Diğer adıma dirbash ile benzer bir işlevselliğe sahip olmayı çok isterdim , ama tam olarak nasıl devam edeceğinden emin değilim.

Şu anda, alias dir='ls -FaGl'içinde .bash_profile, gösteren

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

Örneğin. Bu sorunun cevabını alarak :

dir | awk '{ total += $4 }; END { print total }'

Bu bana toplamı verir, ancak dizinin kendisini yazmaz. Bunu bir liner veya shell kodunda değiştirmenin bir yolu var, böylece lsistediğim herhangi bir argümanı geçebilir dirve tam bir liste artı toplam toplamı alabilir miyim? Örneğin, dir -R *.jpg *.tiftüm alt dizinlerdeki bu dosya türlerinin listesini ve toplam boyutunu almak için koşmak istiyorum . İdeal olarak, her bir alt dizinin boyutunu bulabilirsem harika olurdu, ama bu gerekli değil.


5
Neden ls -lhyardım etmiyorsun Toplam toplamı üste basar. Ayrıca du -sh *.exe, disk alanı kullanım bilgilerini insan tarafından okunabilir biçimde almak için de çalıştırabilirsiniz .
bagavadhar

@ ashwin 'Toplam' ls -lhın ne yazdırdığını bilmiyorum , ancak awkaşağıdaki komut dosyalarının ne hesapladığıyla ya da elle ne eklediğimle ilgili değildir . Bazen, dizindeki KB dosya sayısına yakındır, ancak tahsis edilmiş alt dizin boyutlarını yürürlüğe koyuyor gibi görünmemektedir. Beni tam olarak bu numaranın ne olduğuna dair bir açıklamaya işaret ederseniz minnettar olurum ...
MattDMo

aşağıdaki cevabım sizin için işe yarıyor mu
bagavadhar 17:13

1
ls -lhiçeriğini hesaplayan bir
direk

Yanıtlar:


25

Aşağıdaki işlev ne istediğinizi çoğu yapar:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... ama senden istediğini vermeyecek dir -R *.jpg *.tif, çünkü işe yaramaz ls -R. Bunun için findyardımcı program ile oynamak isteyebilirsiniz .


1
Bu, her bir dosyanın içeriğinin boyutunu arıyorsanız , dosyanın diskte kullandığı boyutu DEĞİLDİR. Bu ayrım çok küçük dosyalar için daha belirgindir. Distro'mda her bir dosya diskte 4 KB'lik parçalarla ayrılmış (300 baytlık bir dosya hala du komutu tarafından bildirildiği gibi diskte 4K kullanıyor). OP'nin “her dosyanın ne kadar yer kapladığını” aradığı göz önüne alındığında, du bunu yapmanın yoludur.
Jon V

1
dirZaten popüler bir GNU coreutil ismi, bunun yerine böyle bir işlevi isimlendirmek istemem.
tatlı

Lütfen düzeltin, böylece hem Linux hem de OS-S’de çalışabilsin ve "-a" dahil et. " ve "..", ki bu iyi değil:) İşte sabit komut: dir () {ls -FAl "$ {@}" | awk '{toplam + = 5 dolar; baskı}; END {baskı "toplam:" toplam} '; }
Dmitry Shevkoplyas

148

Bunun için zaten bir UNIX komutu var: du

Sadece yap:

du -ach 

Kurallara göre, komutun sonuna bir veya daha fazla dosya veya dizin yolu ekleyebilirsiniz. -hboyutu insan dostu bir formata dönüştüren bir uzantıdır, -asize "görünen" boyutu (disk kullanımı yerine dosya boyutu) -cverir ve sonunda toplamı verir.


12
Evet, du iyi çalışıyor. Listenin sonunda toplam almak için -c seçeneğini (--total ile aynı) kullanabilirsiniz.
MikeB,

6
duDosya boyutlarının toplamı değil, disk kullanımı sağladığını unutmayın .
Stéphane Chazelas

7
du -hkendisine iletilen dosyaların boyutlarını toplamıyor. du -h *.soher dosyanın boyutunu gösterir, ancak toplamı değil. Burada ne istediğinizi du -hc *.so(hatta du -hc *.so | tail -1) olduğunu düşünüyorum . Ama elbette rehber listesini de istiyor.
Sınırlı Kefaret

1
Bu komut yalnızca kısa dosya listesiyle çalışır. Bir dizinde 850000 dosyanız olduğunda ne olacağını görün!
Hamid FzM

3
! -aanlamına gelir --all. Kullanmayı düşünün--apparent-size
Arnauld VM

17

Kullanabilirsiniz du -h -c directory|tail -1

Bu bellek kullanımı ile tek bir satır üretecektir.


15
du -hs directoryeğer sadece toplamı istiyorsan.
Stéphane Chazelas

8

Toplamı topladığınız geçerli satırı yazdırmanız yeterlidir:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'

6

perl ile:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Geçerli dizindeki tüm gizlenmemiş PDF dosyalarının boyutu.


1

Aşağıdaki .bash_profile veya .bashrc 'ye eklemek benim için çalışıyor.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Şimdi bir dir * .mp3 yaptığımda özyinelemeli ve sonunda toplam yazdırır. Bulmak istediğiniz maxdepth parametresini ekleyerek ne kadar derinlik istediğinizi kontrol edebilirsiniz. Çalıştırmanın iki kez bulunmasının çok etkili bir fikir olmadığını biliyorum. Ama daha iyi bir yol düşünemiyorum. En azından işi halleder.


1

Du ve yukarıda belirtilen gibi bir awk deyimini kullanmak aradığınızı sağlayacaktır.

Örnek: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Bu, .jpg ile biten abc kullanıcı indirmeleri klasöründeki tüm dosyaları listeler ve listenin sonunda tüm bu dosyaların toplamını yazdırır.


0

Her ikisi de, dir çıktı ve boyut hesaplama, önerilen diğer seçeneklerden herhangi birini kullanmadan, tee (1) kullanabilir ve ikame işlemi kullanabilirsiniz ...

dir | tee >( awk '{ total += $4 }; END { print total }' )

Gerek yok tee, sadecedir | awk '{print; total += $4}; END {print total}'
Stéphane Chazelas

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

3
Hayır. İlk önce, sadece bir emir vermek bir cevap değildir. İkincisi, tüm soruyu, diğer cevapları ve yorumlarımı okumaktan rahatsız olsaydınız, istediğim şeyin bu olmadığını gördünüz.
MattDMo

Postere karşı dürüst olmak gerekirse, bu Google aramasının ilk arama sonucu linux sum human readable sizesve aradığım şey.
Sridhar Sarnobat

-2
du * | awk -v sum=0 '{print sum+=$1}' | tail -1

Bu istediğim şeyi yapmıyor.
MattDMo
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.