xargs를 사용하여 매개변수를 참조하는 방법

xargs를 사용하여 매개변수를 참조하는 방법

1MB보다 큰 폴더의 모든 파일을 삭제하고 싶다고 가정해 보겠습니다.

$ find . -size +1M | xargs -0 rm

이름에 공백이 있는 파일은 삭제되지 않습니다. 그래서 전송되는 모든 매개변수를 인용하고 싶습니다 rm. find주어진 경우 에 Some report.docx전달되어야 합니다 ."Some report.docx"rm

어떻게 해야 하나요?

답변1

비슷한 요구 사항이 있었는데 결국 스위치를 사용하여 -I자리 표시자를 설정했고 이를 참조할 수 있었습니다.

find . -size +1M | xargs -I {} rm "{}"

답변2

이미 비표준을 사용하고 있으므로 1M구현에서도 find이를 지원할 가능성이 높습니다 -delete. 따라서 다음을 사용하세요.

find . -type f -size +1M -delete

지원된다면 이는 단연 가장 안전하고 효과적입니다.

xargsand 를 rm계속 사용하려면 다음 명령을 find추가하세요 .-print0

find . -type f -size +1M -print0 | xargs -r0 rm -f --

( -print0그리고 -0비표준이지만 일반적입니다. (아무것도 발견되지 않으면 실행하지 마십시오 -r)는 덜 일반적이지만 지원하지 않으면 인수 없이 호출되는 것처럼 무시할 수 있습니다.)rmfindxargsrm-f

표준 구문은 다음과 같습니다.

find . -type f -size +1048576c -exec rm -f -- {} +

또 다른 방법:

find . -type f -size +1M -execdir rm -f -- {} +

-exec(이것은 /보다 안전하며 xargs -0매우 깊은 디렉토리 트리에서 작동할 수 있습니다(전체 파일 경로가 감소하는 것보다 커지게 됨 PATH_MAX)rm .

~에서man findGNU 시스템에서:

-print0

True이면 표준 출력에 전체 파일 이름을 인쇄하고 그 뒤에 널 문자(사용된 개행 문자 대신 -print)가 옵니다. 이를 통해 출력을 처리하는 프로그램은 개행 또는 기타 유형의 공백이 포함된 파일 이름을 올바르게 해석할 수 있습니다 find. 이 옵션은 -0옵션 에 해당합니다 xargs.

답변3

옵션은 파이프의 출력이 널 종결자로 해석됨을 -0의미합니다 . xargs이 경우 를 사용하여 파이프에 대한 입력도 생성해야 합니다 find ... -print0.

답변4

실제로 질문에 대한 기존 의견을 다시 작성하여 답변 아래에 표시되도록 했습니다. 제 경우에는 locate특정 문자열이 포함된 파일 이름을 찾는 데 사용했습니다.

Ivan Zaharyachev는 다음과 같이 썼습니다.xargs -d$'\n'구분 기호를 줄 바꿈(공백 아님)으로만 제한 하는 데 사용됩니다 .견적 등은 구체적으로 다루지 않습니다.--GNU 시스템을 확인했습니다.) --답변 제공 stackoverflow.com/a/33528111/94687

예를 들어 Ivan의 제안을 사용하면

$ locate -i example_string | xargs -d$'\n' md5sum

관련 정보