/mydirectory/data/
디렉터리(예 : ) 에 있는 특정 파일의 전체 크기를 계산하려고 하므로 cd
이 특정 디렉터리 다음에 다음 명령을 사용합니다.
du -c *.bin | grep total | awk '{print$1+0}'
명령이 예상대로 작동합니다. 하지만 내가 시도할 때:
du -c /mydirectory/data/*.bin | grep total | awk '{print$1+0}'
오류 메시지가 나타납니다
bash: /usr/bin/du: Argument list too long
이것은 동일한 디렉토리인데 첫 번째 경우에는 작동하지만 두 번째 경우에는 작동하지 않는 이유는 무엇입니까? 두 번째 사례에 대한 추가 확장이 있습니까? 이것은 동일한 수의 파일을 포함하는 동일한 디렉토리입니다.
문제는 이 명령을 큰 스크립트에 넣어야 하기 때문에 bash
매번 디렉터리로 들어갔다가 다시 돌아오는 것이 편리하지 않다는 것입니다.cd
답변1
확장된 인수 목록이 너무 길어질 때 발생합니다. 즉, 인수로 제공된 모든 파일 이름으로 구성된 문자열의 길이(모든 환경 변수 및 해당 값의 길이와 결합)가 특정 값 "매개변수 목록이 너무 김"을 초과하는 경우 발생합니다. 오류. 바이트 수.
운이 좋으면 첫 번째 명령에서 이 오류가 발생하지 않습니다.
두 번째 명령으로 인해 이 오류가 발생합니다. 왜냐하면 이제모든 주장또한 string 을 포함합니다 /mydirectory/data/
. 이는 인수 목록이 최소 18바이트만큼 증가함을 의미합니다.각 매개변수또는 1000개 파일당 18kB입니다.
먼저 다음을 수행하여 이 문제를 해결할 수 있습니다 cd /mydirectory/data
.
( cd /mydirectory/data/ && du -c *.bin ... )
(괄호는 명령의 현재 디렉터리만 변경되므로 " 뒤로" cd
할 필요가 없음을 나타냅니다.)cd
현재는 작동하지만 일치하는 파일을 더 추가하면 여전히 작동하지 않습니다 *.bin
. 이 경우 약간 더 복잡한 접근 방식을 사용해야 할 수도 있습니다.
find /mydirectory/data -maxdepth 1 -type f -name '*.bin' -exec du -c {} + |
awk '/total/ { sum += $1 } END { print sum }'
이는 du
가능한 한 많은 파일에서 실행됩니다.가능한 한 많이귀하의 디렉토리에서 대량으로. 프로그램 grep
에 병합 되었으며 ( 출력을 awk
제공할 타당한 이유가 없었음 ) 이제 프로그램은 간단한 합계를 수행하고 마지막에 이를 출력합니다.awk
grep
awk
명령이 여러 번 실행되어 여러 줄을 생성하므로 awk
합계를 계산하는 프로그램이 필요합니다 .du
total
답변2
find /mydirectory/data -iname "*.bin" -maxdepth 1 |xargs du -c |
awk '{print $1 }'|xargs |tr " " "+" |bc