Apakah ada cara untuk meringkas ukuran file yang terdaftar?

20

Ini adalah perintah yang saya gunakan untuk membuat daftar beberapa file:

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

dan seterusnya.

Sekarang saya ingin menghitung ukuran total file-file ini dengan merangkum kolom ke-5. Saya berpikir untuk menggunakan awk, untuk melakukan ini jadi saya menguji yang berikut di direktori tertentu

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

Saya tidak mengerti apa masalahnya, mengapa kesalahan sintaks ini .

Saya sedang berpikir untuk mencoba

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

ini juga, tetapi awkskrip sederhana tidak berfungsi.

Tolong sarankan atau koreksi saya jika saya salah, atau jika ada solusi untuk ini.

munish
sumber

Jawaban:

26

Pertama-tama, Anda harus menggunakan tanda kutip tunggal lurus ( '), bukan yang cenderung ( `).

The awkScript inline bisa sebagai berikut:

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

jadi, tidak perlu menginisialisasi total( awkmenginisialisasi ke nol), dan tidak perlu mengulang, awksudah menjalankan skrip pada setiap baris input.

enzotib
sumber
1
Singkatnya, satu-liner akan menjadi ini: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
helt
Jangan diurai ls!
Stop Harming Monica
16

@enzotib telah menunjukkan apa kesalahan sintaksis Anda - saya akan sedikit bersinggungan.

Penjumlahan kolom angka adalah salah satu hal yang terus bermunculan. Saya berakhir dengan fungsi shell ini:

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

Dengan ini, solusi Anda menjadi:

ls -lrt | sumcol 5

Itu akan menjumlahkan angka-angka di kolom 5 dan mencetak nilainya.

camh
sumber
Akibatnya, saya bertanya-tanya mengapa tidak ada utilitas standar untuk itu.
enzotib
Masuk langsung ke .aliasesfile saya .
Konrad Rudolph
14

Berikut cara lain untuk melakukan ini dengan menggunakan du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
tuxce
sumber
1
Penggunaan du. Contoh yang bagus. Sebagai manfaat tambahan, Anda dapat menambahkan opsi "-h" ke du untuk mendapatkan output dalam Gig. Maka Anda tidak perlu menghitung angka dan semacamnya. Saya baru saja menjalankan tes pada sekelompok file yang berukuran sekitar 1188800 kbytes. Seberapa besar itu? Tidak masalah, du -ch --files0-from=-beri tahu saya bahwa total saya adalah "9.0G". Sweeeet!
Mike S
Manis, sangat baik menggunakan du!
haridsv
Juga, jika Anda hanya tertarik pada total, maka pipa du output ke tail -1.
haridsv
4

Seandainya HP-UX findjuga memiliki -printfopsi, itu akan berguna untuk menyusun formula untuk bcmenghitung:

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

Jika formula terlalu besar, dapat dihitung langkah demi langkah:

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

Dengan GNU find:

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

Dengan GNU stat:

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

Dengan BSD stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add
nisetama
sumber
Apakah jqsebuah utilitas? Sepertinya tidak ditemukan pada distribusi debian (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
Death Metal