find -name을 xargs로 파이프하면 공백이있는 파일 이름이 명령에 전달되지 않습니다.


26

일반적으로 파일 이름에 공백이있는 파일을 제거하려면 다음을 실행해야합니다.

$ rm "file name"

그러나 여러 파일을 제거하려면 다음과 같이하십시오.

$ find . -name "*.txt" | xargs rm

공백이있는 파일은 삭제되지 않습니다.


여기에 완전한 추측이 있습니다 : find -name "*\ *.txt" | xargs rm두 개의 단어 파일에서 작동합니까?
TheWanderer

답변:


49

널 종결자를 사용 find하고 말할 수 있습니다.xargs

find . -name "*.txt" -print0 | xargs -0 rm

또는 (더 간단하게) 내장 -delete조치를 사용하십시오.find

find . -name "*.txt" -delete

또는 (감사합니다 @kos)

find . -name "*.txt" -exec rm {} +

둘 중 하나가 ARG_MAX필요없이 시스템의 한계를 존중 해야합니다 xargs.


1
당신이 언급 한 이후 그것을 두 번 힘든 :)를 찬성 투표 수 없습니다 ARG_MAX나는 또한 언급 것 find . -name "*.txt" -exec rm {} \;"안전한 샷"될 것은
코스

3
따라서 마스터에게 말하기 : 항상 xargs -0을 기억하십시오.
여호수아

1
매우 중요한 점 : -print0마지막 옵션이어야합니다 (또는 적어도 이후 -name "*.txt"). 그렇지 않으면 파일이 더 이상 제한되지 않습니다*.txt .
Kev

1

또한 find 이외의 것을 사용하면 tr을 사용하여 개행을 널 바이트로 바꿀 수 있습니다.

예 : 다음 하나의 라이너는 이름에 공백이 있어도 디렉토리에서 마지막으로 수정 된 10 개의 파일을 삭제합니다.

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm


그렇습니다.
피터 Mortensen

0

xargs 명령은 기본적으로 탭, 공백 및 줄 바꾸기를 구분 기호로 사용합니다. -d 옵션과 함께 개행 문자 ( '\ n') 만 사용하도록 지정할 수 있습니다.

find . -name "*.txt" | xargs -d '\n' rm

SO에 대한 소스 답변 .


그 대답 은 BSD 시스템에 대해 (for ) -0대신 언급 합니다. 우분투는 무엇을 사용합니까? 여기에 허용 된 답변은을 사용합니다 . 맞습니까? -dxargs-0
Peter Mortensen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.