Dizin ağacındaki belirli bir uzantıdaki tüm dosyaların boyutu


17

Ana klasörümde .o uzantılı (nesne dosyası) dosyanın boyutunu bilmek istiyorum.

Kullanarak tüm nesne dosyalarını bulabilirim

find . -name '*.o'

Şimdi bu dosyaların toplam boyutunu nasıl hesaplayabilirim?

Yanıtlar:


24

Pipolar ( |) arıyorsunuz . Birden çok komutu bağlamanın ve bir komutun çıktısını diğerine girdi olarak geçirmenin bir yoludur. Bu durumda, girdi olarak bulduğunuz tüm dosya adlarını du(boyutu hesaplar) iletmek istersiniz . Bununla birlikte, dudosya adlarının ve sonuçlarının findyalnızca bir metin listesi olması beklendiğinden (evet, metin dosya adlarından oluşur, ancak dutüm gördüğü metindir) bilemez, her xargsbirini alacak gibi bir şey kullanmanız gerekir. satırına bir dosya adı gibi davranıp bunu iletin du. Tüm bunları bir araya getirerek şunu elde ederiz:

find . -name "*.o" | xargs du -sch
  • Eğer gereken zaman size vermek desenleri alıntı find(yukarıda olduğu gibi: "*.o"). Bunu yapmazsanız, kabuk *.ogeçerli dizindeki eşleşen dosyaların adlarını genişletir . Bu durumda yalnızca eşleşen dosyalara sahip olmadığınız için çalıştı.

  • İçin -schbayraklar şu duşekilde belgelenmiştir man du:

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

Ancak bunun boşluk içeren dosya adları için başarısız olacağını unutmayın. Bu neredeyse kesinlikle nesne dosyaları için bir sorun olmayacak, ancak gelecekte boşluklarla da uğraşmanız gerekiyorsa şunu kullanın:

find . -name "*.o" -print0 | xargs -0 du -sch

-print0Yapar findNULL ayrılmış hatlar baskı ve -0yapar xargsgirişi gibi çizgiler alır.

Alternatif olarak, findboyutları kendiniz yazdırabilir ve sonra toplayabilirsiniz :

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

Bu ayrıca , çok fazla argümanın olduğu ve komutun ayrı komutlara bölündüğü yorumlarda @Serg tarafından belirtilen sorunu çözecektir .


bash(Muhtemelen kullanıyorsan ) kullanıyorsanız, daha basit bir yol var:

shopt -s globstar 
du -sch **/*.o

shopt globstarKomut markaları **tüm dosya ve veya daha fazla alt dizinleri maç. Etkinleştirdikten sonra **/*.o, adı biten tüm dosyalarla (ve dizinlerle) eşleşir .o, böylece bunu doğrudan iletebiliriz du.

findYaklaşımdan farklı olarak , bunun gizli dosyalarla (adı a ile başlayanlar .) eşleşmeyeceğini unutmayın . Bunları da eşleştirmek için şunları yapın:

shopt -s dotglob globstar
du -sch **/*.o

Birincisi ile ilgili bir sorun var. MAXARGS diye bir şey var. Yani birden fazla yineleme duolacak ve birden çok totalsatır üretecek . İşte örnek: paste.ubuntu.com/23092752
Sergiy Kolodyazhnyy

@ Doğru olun. Bundan kaçınan başka bir seçenek ekledim.
terdon

İlk shopt globstarörneğiniz -s; shopt -s globstarİkinci örneğinize benzer şekilde kullanmak zorunda kaldım .
CrazyPyro

@CrazyPyro d'oh! Üzgünüm, bu bir yazım hatasıydı. Gösterdiğiniz için teşekkürler. a veya a (veya başka bir seçenek shopt OPTIONolmadan , bkz. ) yalnızca OPTION seçeneğinin geçerli değerini yazdırır. Birini açmanız ve kapatmanız gerekir. -s-uhelp shoptshopt -s OPTIONshopt -u OPTION
terdon

8

Kullanım -exec çalıştırmak için bayrak duile komuta ;(her dosya başına anlamında)

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

Örnek çıktı:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

findözyinelemeli - yani tüm alt dizinlerde yürür. *.oGeçerli dizindeki tüm dosyaların toplamını almak istiyorsanız ,

du -b -c *.o

0

perl ile:

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

Geçerli dizindeki gizli olmayan tüm PDF dosyalarının boyutu.


1
Tamam, ancak OP .odosyaları arıyor ve alt dizinlerde olabilirler. Ayrıca , her yinelemenin toplamını yazdırmaktan kaçınmak için daha }{önce bir tane eklemek isteyebilirsiniz print $sum. Sadece sonuncuyu istiyoruz.
terdon
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.