du를 사용할 때 인수 목록이 너무 깁니다.

du를 사용할 때 인수 목록이 너무 깁니다.

특정 폴더에서 큰 파일을 찾는 명령이 있지만 어떤 이유로 작동하지 않고 "인수 목록이 너무 깁니다"라는 오류가 발생합니다. 이 명령이 항상 작동하도록 수정하려면 어떻게 해야 합니까?

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long

답변1

find와일드카드 대신 명령을 다음으로 바꿀 수 있습니다.

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10

당신이 find+표기법을 지지한다고 가정합니다.

이렇게 하면 자세히 살펴보지 않고도 현재 디렉터리 아래의 모든 항목을 찾을 수 있으며 "."는 무시됩니다. (알려주신 @rudimeier에게 감사드립니다!)

여기에는 원본 glob과 마찬가지로 현재 디렉터리의 모든 파일이 포함됩니다. glob과 달리 이것은 .(이미 활성화하기 위해 쉘 옵션을 사용하지 않는 한 dotglob)로 시작하는 파일도 찾습니다.

답변2

"매개변수 목록이 너무 김"을 처리하는 방법을 찾는 동안 이 문제가 발생했습니다 du. 내 경우에는 출력을 필터링하지 않고 패턴과 일치하는 모든 파일의 총 개수를 가져오고 싶습니다. 다른 질문의 메서드를 사용하면 du인수의 하위 집합을 사용하여 여러 번 호출 되므로 합계를 얻을 수 없습니다 .

해결책은 --files0-from=파일 이름을 매개변수로 전달하는 대신 사용하는 것입니다.

마지막으로 이것은 나에게 효과적이었습니다.

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
  • -L조회와 크기 계산 모두에서 기호 링크를 따릅니다.
  • -c누적 합계 가져오기
  • <()file역동성을 창출하기 위한 프로세스 교체
  • -print0du기대 에 부응
  • \( \)-o두 개의 -name인수 와 함께 사용할 수 있습니다 .

마찬가지로 위 질문에 대한 대답은 다음과 같습니다.

du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10

답변3

최신 버전의 GNU coreutils를 사용하면 다음을 사용할 수 있습니다.--max-depth옵션.을 사용하여 파일을 열거하는 대신 *. 이렇게 하면 파일이 너무 많아도 명령줄 길이 제한에 걸릴 위험이 없습니다. 아니요 --min-depth. 따라서 최상위 디렉터리가 마지막에 나열됩니다.

du -x -d 1 | head -n -1 | sort -r | head -n 10

답변4

sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10

관련 정보