파일을 찾고 총 크기를 어떻게 알 수 있습니까?


12

와일드 카드 식을 기반으로 일련의 파일을 찾고 총 디스크 사용량을 원합니다.

이 같은:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

이 일. 그러나 그것은 내가 찾고있는 결과를 산출하지 않습니다. 각 파일이 사용하는 공간을 find반복하여 나열합니다.

내가 원하는 것은 du발견 된 모든 파일 의 합계 입니다.

답변:


12

해결책

에 옵션 -c(또는 --total)을 제공하면 du(1)총합계를 생성하도록 지시 할 수 있습니다. 구현 du(1)이 이러한 옵션 중 하나 를 지원하는 경우 다음 명령을 사용하여 원하는 효과를 얻을 수 있습니다.

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

편집 : 파일 수가 시스템에서 허용하는 최대 매개 변수 수를 초과 find해도 여전히 command여러 번 실행될 수 있습니다 . 일부 구현은 du(1)파일에서 파일 이름을 읽는 것을 지원하며, 언급 된 제한이 없습니다.

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames

설명

의 의미의 차이 -exec command {} \;와는 -exec command {} +다음과 같다 :

  • command {} \;command각 결과에 대해 한 번씩 실행 find됩니다. 결과의 경로 이름이 대신 전달됩니다 {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
  • command {} +command모든 결과가 검색 되면를 실행 합니다. 결과의 경로 이름이 대신 전달됩니다 {}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3

-print0옵션 find(1)을 사용하면 찾은 파일 이름이 널 문자로 구분 된 표준 출력으로 인쇄되고이 --files0-from옵션 du(1)은 널로 구분 된 파일 이름을 읽습니다. 줄 바꾸기 문자와 달리, 널 문자는 파일 이름에 나타나지 않을 수 있으므로 출력이 명확합니다.

du(1)및 의 옵션에 대한 자세한 내용은 find(1)해당 맨 페이지를 참조하십시오.

$ man du
$ man find

2
명령 행 인수 수 제한으로 인해 파일 수가 중요한 경우 (1K +) 여러 개의 총계로 끝날 수 있습니다.
ychaouche

@ychaouche를 확인할 수 있으며 30k 이상의 파일 크기를 평가하는 동안 문제가 발생했습니다.
Adrien H

그것이 문제라면, 일부 구현은 du(1)파일에서 파일 이름을 읽는 것을 지원합니다 find 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames.
Witiko

4

이 시도:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

원래 명령은 하나의 인수를 제공 한 다음 모든 인수를 통과 할 때까지 실행합니다. 이렇게하면 모든 인수를 한 번에 제공 한 다음 별도의 크기를 잘라 내고 합계 만 남겨 둡니다. 원하는 경우 파이프와 꼬리를 제거하여 각 파일의 크기를 표시 할 수 있습니다.


공백이 포함 된 경로 이름에는 올바른 결과가 생성되지 않습니다. 이를 수행하는 올바른 방법은의 -exec du -c {} +옵션을 사용하는 것입니다 find.이 옵션은 변경되지 않은 경로 이름을 전달합니다 du.
Witiko

4

당신은 이것을 시도 할 수 있습니다 :

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

2

내가 가진 것 find자체가 크기를 인쇄하여 합계를 계산하기 위해 다른 도구를 사용합니다 :

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

파일 이름도 보려면 :

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

1

대부분의 시스템에서 총 기가 바이트를 얻기 위해 작동해야하는 하나의 라이너 :

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.