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
지원된다면 이는 단연 가장 안전하고 효과적입니다.
xargs
and 를 rm
계속 사용하려면 다음 명령을 find
추가하세요 .-print0
find . -type f -size +1M -print0 | xargs -r0 rm -f --
( -print0
그리고 -0
비표준이지만 일반적입니다. (아무것도 발견되지 않으면 실행하지 마십시오 -r
)는 덜 일반적이지만 지원하지 않으면 인수 없이 호출되는 것처럼 무시할 수 있습니다.)rm
find
xargs
rm
-f
표준 구문은 다음과 같습니다.
find . -type f -size +1048576c -exec rm -f -- {} +
또 다른 방법:
find . -type f -size +1M -execdir rm -f -- {} +
-exec
(이것은 /보다 안전하며 xargs -0
매우 깊은 디렉토리 트리에서 작동할 수 있습니다(전체 파일 경로가 감소하는 것보다 커지게 됨 PATH_MAX
)rm
.
~에서man find
GNU 시스템에서:
-print0
True이면 표준 출력에 전체 파일 이름을 인쇄하고 그 뒤에 널 문자(사용된 개행 문자 대신
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