du 명령에서 디렉터리를 지정할 때만 매개변수 목록이 너무 깁니다. 오류가 발생합니다.

du 명령에서 디렉터리를 지정할 때만 매개변수 목록이 너무 깁니다. 오류가 발생합니다.

/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제공할 타당한 이유가 없었음 ) 이제 프로그램은 간단한 합계를 수행하고 마지막에 이를 출력합니다.awkgrepawk

명령이 여러 번 실행되어 여러 줄을 생성하므로 awk합계를 계산하는 프로그램이 필요합니다 .dutotal

답변2

find /mydirectory/data -iname "*.bin" -maxdepth  1 |xargs du -c |
awk '{print $1 }'|xargs |tr " " "+" |bc

관련 정보