2009-08-24 4 views
7

나는 수백 개의 .txt 파일의 합계 크기를 계산하려고하는 많은 수의 디렉토리가 있습니다. 나는 이것을 시험해 보았는데, 대부분 작동한다."--name * .txt | xargs du -hc"가 여러 합계를주는 이유는 무엇입니까?

그러나 끝에 하나씩 합계를주는 대신 여러개를 얻는다. 내 생각 엔 파이프가 한 번에 많은 수의 find 결과물을 전달할 뿐이며, du는 각 배치마다 작동합니다. 이 문제를 해결할 방법이 있습니까?

감사합니다. 알렉스

+0

흠, 확인. 나는 시도했다 : 찾기. -name * .txt | xargs -n 100000 du -hc 하지만 작동하지 않는 것 같습니다. 더 적은 부분 ​​수가 있습니다. 시도 중 찾으십시오. -name * .txt | xargs -L 1000 du -hc '잘 작동하지 않는 것 같습니다. "xargs : 인수 목록이 너무 깁니다"또는 매우 소수의 파일에서만 작동합니다. 다른 의견은 있습니까? 감사! 알렉스 –

답변

11

어떻게 사용에 대한 --files0을-에서 옵션 뒤까지 :

+0

나를 위해 좋은 작품! –

+2

아,이 일은 저에게 도움이되었지만 exec의 echo 대신 find -print0을 사용했습니다. – tladuke

+0

흠 ... -print0 옵션에 대해 몰랐습니다. 그것은 훨씬 더 깨끗합니다. 감사! – Sbodd

0

xargs는 합리적인 크기의 청크로 입력을 파헤칩니다 - 당신이보고있는 것은 그 청크 각각에 대한 합계입니다. 매뉴얼 페이지에서 입력 처리를 구성하는 방법에 대한 xargs를 확인하십시오.

3

xargs 프로그램은 유닉스 명령 줄의 최대 길이로 인한 한계를 설명하기 위해 일괄 처리로 나눕니다. 하위 명령을 한 번에 하나씩 실행하는 것보다 훨씬 효율적이지만, 긴 입력 목록의 경우 각 "실행"이 문제를 일으키지 않을 정도로 충분히 짧은 시간 동안 명령을 실행합니다.

이 때문에 xargs를 실행해야하는 "배치"당 하나의 출력 라인이 표시 될 가능성이 큽니다. 당신이 찾을 수 있기 때문에

유용한/재미있는 매뉴얼 페이지는 온라인 여기에서 찾을 수 있습니다 : http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs


다른 한 가지주의해야 할 (이 귀하의 게시물 또는 내 오해에 오타가있을 수 있습니다) 인 "* .txt"는 이스케이프 처리되지 않은/인용 된 것입니다. 즉, 당신은 일치 ... 대신에 * 전달보다 당신은 아마 명령 줄은 파일 이름의 목록으로 * 확장 될 수있는

find . -name \*.txt | xargs du -hc 

의 차이를 원하는

find . -name *.txt | xargs du -hc 

이 find, 패턴으로 사용합니다.

find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }' 
0

하나 개의 대체 솔루션은 AWK를 사용하는 것입니다? 널 종료 파일 출력을 적절하게 생성해야합니다.

find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=- 

이 제 시스템에서 올바르게 작동해야합니다.

7
find . -print0 -iname '*.txt' | du --files0-from=- 

당신이 그것을 검색 할 여러 가지 확장을 할 경우 어떻게하는 것이 가장 좋습니다 :

find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=- 
+0

'-exec echo {} "= 0";'보다 훨씬 기억하기 쉽습니다. 기다려. 그건 맞지 않습니다. Uhhh'-exec echo -n {} "\ 0"\;'. 아니? – Stephen

+0

당신이 열거 한 첫번째 방법은 결코'-iname * .txt' 테스트와 글로브'* '에 도달하지 않습니다.'-exec echo $ # & @ * # (@ .txt'는 작업 디렉토리에'.txt' 파일이 있다면'find'가 실행되기 전에 확장됩니다 – BroSlow

+0

정확합니다. 오타를 지적 해 주셔서 고맙습니다. 고치 셨습니다. – OmnipotentEntity

3

또 다른 간단한 해결책 :

find . -name *.txt -print0 | xargs -0 du -hc 
+1

게시물은 어떻게/왜 귀하의 게시물이 문제를 해결할 것인지 알려주십시오. –

0

하나 개의 대체 솔루션은 bash는 for을 사용하는 것입니다 루프 :

for i in `find . -name '*.txt'`; do du -hc $i | grep -v 'total'; done 

이것은 루프에서 일어나는 일에 대해 더 많은 제어가 필요할 때 유용합니다.

관련 문제