특정 폴더에서 큰 파일을 찾는 명령이 있지만 어떤 이유로 작동하지 않고 "인수 목록이 너무 깁니다"라는 오류가 발생합니다. 이 명령이 항상 작동하도록 수정하려면 어떻게 해야 합니까?
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
역동성을 창출하기 위한 프로세스 교체-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