정규식으로 파일 삭제


40

나는 A로 시작하고 2 개의 숫자로 끝나는 파일을 삭제하려고 시도했지만 아무것도하지 않습니다.
내가 시도한 것 :

rm ^A*[0..9]2$

내가 어디 틀렸어?

답변:


56

다음 명령을 사용하여 기준과 일치하는 모든 파일을 삭제할 수 있습니다.

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

작동 방식 :

  1. ls 모든 파일을 나열합니다 (결과가 파이프되므로 한 줄에 하나씩).

  2. grep -P "^A.*[0-9]{2}$" 파일 목록을 필터링하고 정규식과 일치하는 파일 만 남겨 둡니다. ^A.*[0-9]{2}$

    • .*은 발생 횟수를 나타냅니다 .. 여기서 .문자와 일치하는 와일드 카드입니다.

    • [0-9]{2}은 정확히 두 개의 어커런스 [0-9], 즉 모든 숫자를 나타냅니다 .

  3. xargs -d"\n" rm파이프로 연결될 rm line때마다 한 번씩 실행 line됩니다.

내가 어디 틀렸어?

우선, rm정규식을 인수로 받아들이지 않습니다. 와일드 카드 외에 *다른 모든 문자는 그대로 처리됩니다.

또한 정규 표현식이 약간 벗어났습니다. 예를 들어, *어떤 사건을 의미 ...정규 표현식에서, 그래서 A*경기 A, AA등, 심지어 빈 문자열을.

자세한 내용은 Regular-Expressions.info를 방문하십시오 .


3
파일 이름의 공백을주의하십시오.
slhck

1
-d"\n스위치는 공간 문제를 해결.
Frg

1
참고-Mac OS와 같은 일부 배포판에는 grep -P(Perl 정규식) 이 없습니다 . grep -E이 경우 작동 할 수 있습니다.
bluescrubbie

1
내가 사용하여 선호 -Ixargs먼저 비 살상 명령을 항상 테스트 :xargs -d"\n" -I {} echo "{}"
jozxyqk

1
파싱 ls? 이 기사 를 가리키는 이 질문 을 참조 하십시오 . 함정 때문에 rm원하지 않는 것이 있습니다.
Kamil Maciorowski

45

또는 사용 find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

이 솔루션은 이상한 파일 이름을 처리 합니다.


4
이것은 훌륭한 솔루션입니다. 더 간단하기 때문에 선호합니다. 파일을 대량으로 삭제하기 전에 먼저 정규 표현식이 올바른지 확인하기 위해 끝에 -delete 플래그를 생략 할 수 있습니다.
JAMESSTONEco

1
또한 삭제 한 항목에 대한 제어 기능이 향상되었습니다 (예-type f
Marco Sulla

파일 및 폴더를 삭제하는 데 사용할 수 있습니까? 비어 있지 않은 폴더에는 작동하지 않습니다.
Alex

아니 @ 알렉스, 디렉토리, 당신은 사용할 수 있습니다 (이 영업 요구 사항 어쨌든 아니었다) 비어 있어야 xargs와 접근 방식을 rm -f.
cYrus


1

regexp가있는 솔루션은 200 배 더 좋습니다. 명령을 사용하기 전에 어떤 파일이 삭제되어 최종 파이프가 잘 릴지 알 수 있습니다.

ls | grep -P "^A.*[0-9]{2}$"

그런 다음 올바른 경우 다음을 사용하십시오.

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Unix로 작업하는 경우 grep 사용법을 알아야합니다. 사용 방법을 알고 있으면 매우 강력합니다.


1
이것은 Dennis의 4 살짜리 답변이 이미 말한 것 이상을 추가하지는 않는 것 같습니다 .
8bittree

1
"200 배"는 꽤 구체적입니다. 다른 많은 명령도 매우 강력하므로 사용 방법을 배우기 만하면됩니다.
glenn jackman

1

이것은 내 Mac에서 작동합니다.

rm $(ls | grep -e '^A*[0..9]2$')


0

find 명령은 정규식에서도 작동합니다.

삭제할 파일 확인

find . -regex '^A.*[0-9]{2}$'

파일 삭제

find . -regex '^A.*[0-9]{2}$' -delete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.