"du"에 있는 모든 숫자를 더하세요.

"du"에 있는 모든 숫자를 더하세요.

우리는 우리가 얻은 첫 번째 숫자를 계산하고 싶습니다.du

du -b /tmp/*
6       /tmp/216c6f99-6671-4865-b8bc-7205f5388752_resources
668669  /tmp/hadoop7887078727316788325.tmp
6       /tmp/hadoop-hdfs
42456   /tmp/hive
32786   /tmp/hsperfdata_hdfs
6       /tmp/hsperfdata_hive
32786   /tmp/hsperfdata_root
262244  /tmp/hsperfdata_yarn

따라서 최종 합계는 다음과 같습니다.

sum=6+668669+6+42456+32786+6+32786+262244


echo $sum

awk나 Perl oneliner를 통해 어떻게 이를 수행할 수 있나요?

답변1

AWK에서는:

{ sum += $1 }
END { print sum }

그래서

du -b /tmp/* | awk '{ sum += $1 } END { print sum }'

디렉터리 자체에 하위 디렉터리가 있는 경우 디렉터리와 해당 하위 디렉터리에 대한 누계가 생성되므로 /tmp결과가 올바르지 않게 됩니다 .du

du -s/tmp( 숨겨진 파일을 포함하여 의 모든 하위 디렉터리와 파일에 대해) 합계를 올바르게 계산합니다 .

du -sb /tmp

du -c나열된 디렉터리와 파일의 합계도 올바르게 계산 합니다 .

du -cb /tmp/*

답변2

선택한 파일의 총 개수 생성을 사용할 수도 있습니다 du -c. 이는 인수가 du디렉터리가 아닌 경우에도 작동하지만 다음은 작동하지 않습니다 du -s.

$ du -sb file1 file2
17  file1
18  file2

$ du -cb file1 file2
17  file1
18  file2
35  total

-h그런데 대화식 사용을 위해서는 대신 옵션을 추가하거나 -b다른 블록 크기 승수를 추가하는 것이 좋습니다 . 이렇게 하면 사람이 읽을 수 있는 단위로 치수가 인쇄됩니다.

$ du -ch file1 file2
4.0K    file1
4.0K    file2
8.0K    total

답변3

쉽습니다. 다음을 사용할 수 있습니다.

 du -b /tmp/* | awk 'BEGIN{i=0} {i=i+$1} END{print i}'

와일드카드를 사용하지 않고 유사한 디렉터리 이름을 사용하는 경우 출력이 다음과 같으 /tmp므로 마지막 항목을 피해야 합니다 .du -b /tmp

size1 file1
size2 file2
size_total .

이제 마지막 항목을 피해야 하므로 다음을 사용하십시오.

du -b /tmp | awk 'BEGIN{i=0} {if( $2 != "." ){i=i+$1}} END{print i}'

하지만 이 옵션을 사용 -s하면 요약이 계산되므로 값을 추가할 필요 없이 마지막 값만 인쇄하면 됩니다. 예:

du -s directory

관련 정보