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

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.