Listelenen dosyaların boyutunu özetlemenin bir yolu var mı?


20

Bu, bazı dosyaları listelemek için kullanıyorum komut:

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

ve bunun gibi.

Şimdi 5. sütunu toplayarak bu dosyaların toplam boyutunu hesaplamak istiyorum. Bunu kullanmayı düşündüm awk, bunu yapmak için belirli bir dizinde aşağıdakileri test ettim

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched

Sorunun ne olduğunu, neden bu sözdizimi hatasının olduğunu anlamıyorum .

Denemeyi düşünüyorum

ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

bu da basit bir awkbetik çalışmıyor.

Lütfen yanılıyorsam veya bunun için bir çözüm varsa lütfen önerin veya düzeltin.

Yanıtlar:


26

Her şeyden önce, 'eğimli olanları ( `) değil, düz tek tırnak ( ) kullanmalısınız .

awkSatır içi komut dosyası aşağıdaki gibi olabilir:

ls -lrt | awk '{ total += $5 }; END { print total }'

bu nedenle, başlatmaya gerek yoktur total( awksıfıra başlatır) ve döngü gerektirmez, awkkomut dosyasını her girdi satırında yürütür.


1
Özetle, tek satırlık olurdu bu: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
— helt


16

@enzotib sözdizimi hatasının ne olduğunu zaten belirtti - biraz teğet geçeceğim.

Bir sayı sütunu toplamak, ortaya çıkmaya devam eden şeylerden biridir. Ben bu kabuk fonksiyonu ile sona erdi:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

Bununla çözümünüz:

ls -lrt | sumcol 5

Bu, 5. sütundaki sayıları toplar ve değeri yazdırır.


Aslında, bunun için neden standart bir yardımcı program olmadığını merak ediyordum.
— enzotib

Doğrudan dosyama giriyor .aliases.
— Konrad Rudolph

14

Bunu kullanarak bunu yapmanın başka bir yolu du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'

1
Mükemmel du kullanımı. Güzel bir örnek. Ek bir avantaj olarak, çıktıyı Gig olarak almak için du'ya "-h" seçeneğini ekleyebilirsiniz. O zaman rakamları saymanıza gerek yok. Ben sadece yaklaşık 1188800 kbyte büyüklüğünde dosyalar üzerinde bir test yaptım. Ne kadar büyük? Olursa olsun, du -ch --files0-from=-toplamımın "9.0G" olduğunu söylüyor. Sweeeet!
— Mike S

Tatlı, mükemmel du kullanımı!
— haridsv

Ayrıca, sadece toplamla ilgileniyorsanız, o zaman boru du çıkışına tail -1.
— haridsv

4

HP-UX'in findde -printfseçeneği varsa, bchesaplamak için bir formül oluşturmak yararlı olacaktır :

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

Formül çok büyük olursa, adım adım hesaplanabilir:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc

1

GNU ile find:

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

GNU ile stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

BSD ile stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add

Mı jqbir yardımcı? Debian dağıtımında bulamıyorum (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
— Death Metal
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.