![du를 사용할 때 인수 목록이 너무 깁니다.](https://rvso.com/image/97215/du%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EC%9D%B8%EC%88%98%20%EB%AA%A9%EB%A1%9D%EC%9D%B4%20%EB%84%88%EB%AC%B4%20%EA%B9%81%EB%8B%88%EB%8B%A4..png)
특정 폴더에서 큰 파일을 찾는 명령이 있지만 어떤 이유로 특정 상황에서는 작동하지 않고 "인수 목록이 너무 깁니다"라는 오류가 발생합니다. 이 명령이 매번 작동하도록 수정하려면 어떻게 해야 합니까?
jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long
답변1
find
globbing 대신 해당 명령을 대체하여 수행할 수 있습니다.
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
즉석에서 생성하기 위한 프로세스 대체-print0
du
기대에 부응하다\( \)
-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