Чи є спосіб підсумувати розмір перелічених файлів?


20

Це команда, яку я використовую для переліку деяких файлів:

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

і так далі.

Тепер я хочу обчислити загальний розмір цих файлів шляхом підсумовування 5-го стовпця. Я думав використати awkце для того, щоб перевірити наступне у певному каталозі

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

Я не розумію, у чому проблема, чому ця синтаксична помилка .

Я думаю спробувати

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

це також, але простий awkсценарій не працює.

Підкажіть, будь ласка, або виправте мене, якщо я не прав, або якщо для цього є рішення.

Відповіді:


26

Перш за все, слід використовувати прямі одиничні лапки ( '), а не похилі ( `).

awkВбудований сценарій може бути наступним:

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

Таким чином, не потрібно ініціалізувати total( awkініціалізує його до нуля), і не потрібно циклічно, awkвже виконує скрипт у кожному рядку введення.


1
Підсумовуючи, однолінійним було б таке: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
— helt


16

@enzotib вже вказав, у чому полягає ваша синтаксична помилка - я збираюся піти на невелику дотичну.

Підведення підсумків стовпців чисел - одна з тих речей, яка постійно з’являється. Я закінчив цю функцію оболонки:

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

Завдяки цьому ваше рішення стає:

ls -lrt | sumcol 5

Це підсумовує числа у стовпці 5 та друкує значення.


Насправді мені було цікаво, чому для цього не існує стандартної утиліти.
— enzotib

Переходить прямо до мого .aliasesфайлу.
— Конрад Рудольф

14

Ось ще один спосіб зробити це за допомогою du:

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

1
Відмінне використання du. Гарний приклад. Як додаткову перевагу, ви можете додати параметр "-h" до du, щоб отримати вихід у Gig. Тоді вам не доведеться рахувати цифри тощо. Я щойно провів тест на купі файлів розміром приблизно 1188800 кбайт. Наскільки це велике? Неважливо, du -ch --files0-from=-каже мені, що мій загальний "9,0G". Солодка!
— Майк S

Солодке, відмінне використання дю!
— haridsv

Крім того, якщо вас цікавить лише загальна кількість, тоді виведете трубу du tail -1.
— haridsv

4

Якщо HP-UX findтакож має -printfможливість, то було б корисно скласти формулу для bcобчислення:

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

Якщо формула стає занадто великою, її можна обчислити поетапно:

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

1

З GNU find:

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

З GNU stat:

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

З BSD stat:

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

Це jqутиліта? Здається, ви не знайдете в дистрибутиві debian (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
— Death Metal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.