나열된 파일 크기를 합산하는 방법이 있습니까?


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

등등.

이제 다섯 번째 열을 요약하여 이러한 파일의 총 크기를 계산하려고합니다. 나는 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( awk0으로 초기화) 루프 할 필요가 없으며 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파일 로 바로 이동 합니다.
Konrad Rudolph

14

다음을 사용하여이를 수행하는 다른 방법이 있습니다 du.

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

1
뒤의 우수한 사용. 좋은 예입니다. 추가 혜택으로, "-h"옵션을 du에 추가하여 Gig에서 출력을 얻을 수 있습니다. 그런 다음 숫자를 세지 않아도됩니다. 방금 크기가 약 1188800KB 인 많은 파일에 대해 테스트를 실행했습니다. 얼마나 큽니까? 상관없이, du -ch --files0-from=-내 총은 "9.0g의이"저를 알려줍니다. 스위트!
Mike 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유틸리티는? 데비안 배포판을 찾지 못하는 것 같습니다 (데비안 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
데스 메탈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.