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

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

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

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

답변1

findglobbing 대신 해당 명령을 대체하여 수행할 수 있습니다.

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

관련 정보