Czy istnieje sposób podsumowania wielkości wymienionych plików?

20

Oto polecenie, którego używam do wyświetlenia niektórych plików:

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

i tak dalej.

Teraz chcę obliczyć całkowity rozmiar tych plików, sumując piątą kolumnę. Pomyślałem o użyciu awk, aby to zrobić, dlatego przetestowałem następujące elementy w określonym katalogu

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

Nie rozumiem, na czym polega problem, dlaczego ten błąd składniowy .

Zastanawiam się, aby spróbować

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

to także, ale prosty awkskrypt nie działa.

Proszę zasugerować lub poprawić mnie, jeśli się mylę, lub jeśli istnieje obejście tego problemu.

Munish
źródło

Odpowiedzi:

26

Przede wszystkim powinieneś używać prostych pojedynczych cudzysłowów ( '), a nie nachylonych ( `).

awkSkrypt inline mogą być następujące:

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

więc nie ma potrzeby inicjowania total( awkinicjuje go do zera) i nie ma potrzeby zapętlania, awkjuż wykonuje skrypt w każdym wierszu danych wejściowych.

enzotib
źródło
1
Podsumowując, jedna linijka wyglądałaby następująco: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
het
Nie parsuj ls!
Stop Harming Monica,
16

@enzotib już wskazał, jaki jest twój błąd składniowy - idę na małą styczną.

Sumowanie kolumny liczb jest jedną z tych rzeczy, które wciąż się pojawiają. Skończyłem z tą funkcją powłoki:

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

Dzięki temu Twoje rozwiązanie staje się:

ls -lrt | sumcol 5

To zsumuje liczby w kolumnie 5 i wydrukuje wartość.

camh
źródło
W efekcie zastanawiałem się, dlaczego nie ma do tego standardowego narzędzia.
enzotib
Wchodzi prosto do mojego .aliasespliku.
Konrad Rudolph
14

Oto inny sposób, aby to zrobić za pomocą du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'
smoking
źródło
1
Doskonałe wykorzystanie du. Niezły przykład. Dodatkową korzyścią jest dodanie opcji „-h” do du w celu uzyskania wyjścia w Gig. Nie musisz wtedy liczyć cyfr i tym podobnych. Właśnie uruchomiłem test na grupie plików o rozmiarze około 1188800 KB. Jak duże to jest? Nie ważne, du -ch --files0-from=-mówi mi, że moja suma to „9.0G”. Sweeeet!
Mike S
Słodkie, doskonałe wykorzystanie du!
haridsv
Ponadto, jeśli interesuje Cię tylko suma, następnie potok wyjściowy do tail -1.
haridsv
4

W przypadku, gdy HP-UX findma również -printfopcję, przydatne byłoby skomponowanie formuły bcdo obliczenia:

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

Jeśli formuła staje się zbyt duża, można ją obliczyć krok po kroku:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc
człowiek w pracy
źródło
1

Z GNU find:

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

Z GNU stat:

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

Z BSD stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add
nisetama
źródło
Czy jqnarzędzie? Wydaje się, że nie można go znaleźć w dystrybucji Debian (Debian 4.9.51-1 (28.09.2017) x86_64 GNU / Linux)
Death Metal