xargs로 인수를 인용하는 방법


15

폴더에서 1MB보다 큰 모든 파일을 삭제한다고 가정합니다.

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

이름에 공백이있는 파일은 삭제되지 않습니다. 그래서 나는 그것이 보내는 모든 인수를 인용하고 싶습니다 rm. 경우 find그것을 제공 Some report.docx이 통과해야 "Some report.docx"rm.

어떻게해야합니까?


1
를 사용 하기 전에이 mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 를 읽어야합니다 xargs. 또한 위키에서 알 수 있듯이 to xargs를 전달 하지 않고 사용 하지 마십시오 . -print0find
Valentin Bajrami


사용은 xargs -d$'\n'단지 새로운 라인에 구분 기호를 제한하는 (그리고 공간, 이것은하지 않을 특별히 등 따옴표 처리 - 나는 GNU 시스템에서 확인했습니다) -에 주어진 대답 stackoverflow.com/a/33528111/94687을
imz-Ivan Zakharyaschev 12

답변:


13

간단한 사용 :

find . -size +1M -delete

xargsand rmwith를 사용한다고 주장하면 다음 명령을 find추가 -print0하십시오.

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

다른 방법 :

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

보낸 사람 man find:

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.

3
이렇게하면 문제가 해결되지만 실제로 인수를 인용하면 다른 경우에 유용합니다. 그래서 나는 다른 답변을 기다릴 것입니다. 간단한 해결책은 +1입니다.
Kshitiz Sharma

2
@KshitizSharma 아니, 당신은 통과하지 않으 "Some report.docx"rm파일 이름이 따옴표를 포함하지 않는. 당신이 원하는 것은 Some report.docxunmolested에 전달 하는 것 rm입니다. KasiyA의 답변 (현재)은을 사용하여 일반적인 방법을 보여줍니다 find. [KasiyA : 잘못된 핑을 먼저 죄송합니다.]
Gilles 'SO- 악의를

@ 질. bash에서 나는 일반적으로 문자열을 인용하여 unmolested로 전달합니다. 그래서 내가 무엇을 의미하는지 인용하여 대신에 분할을가되는 RM은 단일 인수로 파일 이름을 전송하는 것이었다 $0$1
Kshitiz 샤르마을

OSX에서는 xargs -0대신에 xargs -r0합니다.
Rolf

8

옵션 -0xargs파이프의 출력이 널 종료 항목으로 해석됨을 의미합니다. 이 경우을 사용하여 파이프에 대한 입력을 작성해야합니다 find ... -print0.


6

비슷한 요구 사항이 있었고 -I스위치를 사용하여 자리 표시자를 사용하여 견적을 작성할 수있었습니다.

find . -size +1M | xargs -I {} rm "{}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.