디렉토리 트리에서 특정 확장자의 모든 파일 크기


17

내 홈 폴더에 확장자가 .o 인 파일 크기 (개체 파일)를 알고 싶습니다.

나는 사용하여 모든 객체 파일을 찾을 수 있습니다

find . -name '*.o'

이제 해당 파일의 총 크기를 어떻게 계산할 수 있습니까?

답변:


24

파이프 ( |)를 찾고 있습니다. 여러 명령을 연결하고 한 명령의 출력을 다른 명령의 입력으로 전달하는 방법입니다. 이 경우 입력으로 찾은 모든 파일 이름 du(크기 계산) 을 전달하려고합니다 . 때문에, du예상하는 파일 이름과의 결과가 find텍스트의 단지 목록입니다 (예, 텍스트 파일 이름으로 구성되어 있지만, du그 알 수없는, 그것을보고 모든 텍스트이다)처럼, 당신은 사용 뭔가가 필요 xargs하는 각 걸릴 것입니다 텍스트 줄에서 파일 이름으로 취급하고에 전달하십시오 du. 이 모든 것을 종합하면 다음과 같은 이점이 있습니다.

find . -name "*.o" | xargs du -sch
  • 당신은 항상 당신이주는 패턴을 인용 해야 합니다 find(위에서 한 것처럼 :) "*.o". 그렇지 않으면, 쉘은 *.o현재 디렉토리에서 일치하는 파일 이름으로 확장합니다 . 이 경우 일치하는 파일이 없기 때문에 작동했습니다.

  • 에 대한 -sch플래그는 du다음과 man du같습니다.

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

그러나 공백이 포함 된 파일 이름의 경우에는 실패합니다. 이것은 거의 확실히 객체 파일에는 문제가되지 않지만 앞으로 공백을 처리해야하는 경우 다음을 사용하십시오.

find . -name "*.o" -print0 | xargs -0 du -sch

-print0브랜드는 findNULL로 구분 선을 인쇄하고 -0브랜드는 xargs입력 등을 행.

또는 find크기 자체를 인쇄 한 다음 합산 할 수 있습니다.

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

이것은 너무 많은 인수가 있고 명령이 별도의 명령으로 분리 되는 주석 에서 @Serg가 언급 한 문제를 해결할 것 입니다.


사용하고 있다면 bash(아마도) 더 간단한 방법이 있습니다.

shopt -s globstar 
du -sch **/*.o

shopt globstar명령은 **모든 파일 및 하위 디렉토리를 일치시킵니다. 활성화하면 **/*.o이름이로 끝나는 모든 파일 (및 디렉토리)과 일치 .o하므로 직접 전달할 수 있습니다 du.

find접근 방식 과 달리 숨겨진 파일 (이름이로 시작하는 파일)과는 일치하지 않습니다 .. 이들도 일치 시키려면 다음을 수행하십시오.

shopt -s dotglob globstar
du -sch **/*.o

첫 번째 문제에는 약간의 문제가 있습니다. MAXARGS와 같은 것이 있습니다. 따라서 여러 번 반복 du하여 여러 total줄 을 생성 합니다. 예를 들면 다음과 같습니다. paste.ubuntu.com/23092752
Sergiy Kolodyazhnyy

@Serg true. 나는 그것을 피하는 다른 옵션을 추가했습니다.
terdon

첫 번째 shopt globstar예제는 -s; 나는 shopt -s globstar두 번째 예와 비슷하게 사용해야했습니다 .
CrazyPyro

@CrazyPyro d' oh! 죄송합니다. 오타였습니다. 지적 해 주셔서 감사합니다. 또는 (또는 다른 옵션, 참조 )이 shopt OPTION없으면 OPTION의 현재 값만 인쇄합니다. 당신은 필요 에 하나를 켜고 끌 수 있습니다. -s-uhelp shoptshopt -s OPTIONshopt -u OPTION
terdon

8

-exec 플래그를 사용 du하여 ;(각 파일 당 의미)

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

샘플 출력 :

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

find재귀-그것은 모든 하위 디렉토리를 걷는다는 것을 의미합니다. *.o현재 디렉토리에있는 모든 파일 을 가져 오려면 그냥하십시오.

du -b -c *.o

0

펄로 :

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

현재 디렉토리에서 숨겨지지 않은 모든 PDF 파일의 크기입니다.


1
그러나 OP는 .o파일을 찾고 있으며 하위 디렉토리에있을 수 있습니다. 모든 반복에 대한 합계를 인쇄하지 않도록 }{이전 을 추가 할 수도 있습니다 print $sum. 우리는 마지막 것을 원합니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.