Есть ли способ суммировать размер файлов в списке?


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 и выводит значение.


По сути, мне было интересно, почему нет стандартной утилиты для этого.
энзотиб

Идет прямо в мой .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". Sweeeet!
Майк С

Сладкий, отлично использовать дю!
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.