LS | grep | rm —이 명령의 형식을 지정하는 방법은 무엇입니까?


11

특정 디렉토리 (터미널을 사용하는 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"를 삭제해야합니다.

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

고마워, Jeff


1
파일 이름 예에 리터럴이 포함되어 있지 않습니다 #.
Benjamin Bannier

1
@honk : 그는 리터럴을 찾지 않습니다 #.
Ignacio Vazquez-Abrams

1
쉘에 의한 확장으로 인해 cwd에 파일 이름이 eg 인 경우 예상대로 작동하지 않습니다 (3). 쉘이 영향을 미치지 않도록 인수를 인용하는 것이 가장 좋습니다.
Ignacio Vazquez-Abrams

답변:


19

짧은 버전 :

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와일드 카드 로 단축 할 수 있습니다 .


일반적으로 lsfind줄 바꿈과 별도의 파일 이름,하지만 xargs줄 바꿈으로 입력을 분할 또는 당신이 볼 수있는 행동의 결과로, 공간.

그것은 가능 TELL입니다 xargs만 줄 바꿈에 의해 분할에 있지만, 파일 도 이름에 줄 바꿈이있다. 실제로 Linux 및 BSD에서 허용되지 않는 유일한 문자"널 (null)" 또는 0 바이트 입니다. 따라서 이러한 경우에 사용해야합니다.

위의 예 2에서 파일 이름을 널 바이트로 구분하도록 -print0지시 find합니다. 동일합니다 xargs -0. (몇 가지 다른 도구는 또한 유사한 옵션을 가지고 sort -z또는 grep -zZ.)

"짧은 버전"은 간단한 쉘 와일드 카드를 사용합니다 ( bash매뉴얼의 "패턴" – "경로 확장"섹션 참조).


1
그리고 안전을 위해 *" "\\([1-9]\\).*(a, 공정한) 기간 이전에 paren'd 번호 앞에 공백이있는 파일 만 삭제되도록 사용하는 것이 좋습니다 .
Ignacio Vazquez-Abrams

이 구문에 익숙하지는 않지만, 공감대를 기반으로 한 시도를했고 당신은 무엇을 알고 있었습니까? 감사!
Jeff

1
+1. -print0은 xargs 로의 올바른 배관에 필수적입니다.
Chris W. Rea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.