ls | 그렙 | rm - 이 명령의 형식을 어떻게 지정합니까?

ls | 그렙 | rm - 이 명령의 형식을 어떻게 지정합니까?

특정 디렉터리(Mac OS X에서는 터미널을 사용)에서 여러 파일을 삭제하려고 합니다.

ls | grep \([1-9]\) | xargs rm

트릭을 수행해야하지만 그렇지 않습니다. 파일 이름에 괄호 안에 한 자리 숫자가 있는 파일(웹에서 다운로드한 중복 파일)을 삭제하려고 하는데 다음과 같은 결과가 발생합니다.

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

공간을 올바르게 해석하지 않기 때문입니다. "520syllabus2010 (3).pdf"를 삭제해야 합니다.

이 작업을 수행하는 올바른 방법은 무엇입니까?

고마워요, 제프

답변1

짧은 버전:

rm *\([1-9]\)*

ls로 파이프하지 마십시오 xargs. 대신 이러한 문제를 방지하려면 로 파이프 find ... -print0하십시오 .xargs -0

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

...다음과 같이 작성할 수 있습니다.

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

그리고:

find . -maxdepth 1 -name '*([1-9])*' -delete

rm와일드카드를 사용하여 더 단축할 수 있습니다 .


일반적으로 ls파일 find이름을 줄바꿈으로 구분하지만 xargs입력은 줄바꿈으로 분할합니다.또는공간이 생겨서 보이는 동작이 발생합니다.

xargs줄 바꿈으로만 분할하도록 지시할 수 있지만 파일은~할 수 있다이름에도 개행 문자가 있습니다. 실제로 Linux와 BSD에서는오직 허용되지 않는 문자"없는"또는 0바이트– 그래서 그러한 경우에 사용해야 하는 것입니다.

위의 예제 2에서는 파일 이름을 널 바이트로 구분하도록 -print0지시합니다 . find에 대해서도 마찬가지입니다 xargs -0. ( sort -z또는 같은 다른 도구에도 비슷한 옵션이 있습니다 grep -zZ.)

"짧은 버전"은 간단한 쉘 와일드카드("패턴")를 사용합니다.bash수동– "경로 이름 확장" 섹션을 참조하세요.

관련 정보