답변:
파이프 ( |
)를 찾고 있습니다. 여러 명령을 연결하고 한 명령의 출력을 다른 명령의 입력으로 전달하는 방법입니다. 이 경우 입력으로 찾은 모든 파일 이름 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
브랜드는 find
NULL로 구분 선을 인쇄하고 -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
shopt globstar
예제는 -s
; 나는 shopt -s globstar
두 번째 예와 비슷하게 사용해야했습니다 .
shopt OPTION
없으면 OPTION의 현재 값만 인쇄합니다. 당신은 필요 에 하나를 켜고 끌 수 있습니다. -s
-u
help shopt
shopt -s OPTION
shopt -u OPTION
-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
du
하여 여러total
줄 을 생성 합니다. 예를 들면 다음과 같습니다. paste.ubuntu.com/23092752