Yanıtlar:
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
shopt globstarörneğiniz -s; shopt -s globstarİkinci örneğinize benzer şekilde kullanmak zorunda kaldım .
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
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
perl ile:
perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf
Geçerli dizindeki gizli olmayan tüm PDF dosyalarının boyutu.
.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.
duolacak ve birden çoktotalsatır üretecek . İşte örnek: paste.ubuntu.com/23092752