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


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.