정규식으로 파일 제거

정규식으로 파일 제거

[0-9A-Z]{1,2}_\d{4}_\w+?\.dat예를 들어, A1_2001_pm23aD.dat, 와 같이 이름이 일치하는 파일을 유지하고 K_1998_12.dat나머지는 제거하고 싶습니다 .

그러나 lsrm명령은 이러한 정규 표현식을 지원하지 않습니다. 어떻게 해야 하나요?

답변1

확장된 글로브 사용:

shopt -s extglob
printf '%s\n' !([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)

!그러면 ( ) 일치 하지 않는 모든 파일/디렉토리 이름이 인쇄 [[:digit:][:upper:]]되고 그 뒤에 0 또는 1, s 사이에 [[:digit:][:upper:]]4가 오고 확장자 앞에 1 이상이 옵니다 . 재귀적으로 검색하려면 다음을 수행하세요.[[:digit:]]_[[:alnum:]].dat

shopt -s globstar
shopt -s extglob
printf '%s\n' **/!([[:digit:][:upper:]]?([[:digit:][:upper:]])_[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_+([[:alnum:]]).dat)

또는 다음을 사용하여 gnu find(정규식을 사용할 수 있음):

find . -regextype egrep ! -regex '.*/[[:digit:][:upper:]]{1,2}_[[:digit:]]{4}_[[:alnum:]]+\.dat$'

답변2

이를 수행하는 방법에는 여러 가지가 있습니다. 정규식을 이해하는 스크립팅 언어를 사용할 수 있습니다. 예를 들어 Perl에서는 다음과 같습니다.

perl -le 'unlink(grep(!/[0-9A-Z]{1,2}_\d{4}_\w+?.dat/,@ARGV))' *

그러면 모든 파일이 검색됩니다(하위 디렉터리가 아님) 현재 디렉터리에서 정규식과 일치하지 않는 항목을 수집하여 삭제합니다.

Bash를 사용하여 비슷한 작업을 수행할 수도 있습니다. 정규식을 POSIX ERE로 변환하면 됩니다.

for f in *; do 
    [[ "$f" =~ [0-9A-Z]{1,2}_[0-9]{4}_[a-zA-Z0-9]+.dat ]] || rm "$f"; 
done

정규식에서 \w+?.dat가능한 가장 작은 영숫자 문자열과 일치하려고 시도합니다.모든 문자그리고 dat. 왜 여기를 사용하고 싶은지 알 수 없으며 +?아마도 \.dat. 나는 또한 당신이 아마도 전체 파일 이름이 일치하는지 확인하여 같은 것들도 foobarfoobarfoobarA1_2001_pm23aD.datfoobarfooabr제거되기를 원할 것이라고 생각합니다. 그렇다면 대신 다음 중 하나를 사용하십시오.

perl -le 'unlink(grep(!/^[0-9A-Z]{1,2}_\d{4}_\w+\.dat$/,@ARGV))' *

또는

for f in *; do 
    [[ "$f" =~ ^[0-9A-Z]{1,2}_[0-9]{4}_[a-zA-Z0-9]+.dat$ ]] || rm "$f"; 
done

마지막으로 디렉토리도 삭제하려면 다음을 수행할 수 있습니다.

for f in *; do 
    [[ "$f" =~ ^[0-9A-Z]{1,2}_[0-9]{4}_[a-zA-Z0-9]+.dat$ ]] || rm -rf "$f"; 
done

답변3

당신은 그것을 할 수 있습니다 find:

find . -regextype posix-extended \
            -type f ! -regex '.*/[0-9A-Z]{1,2}_[[:digit:]]{4}_[[:alnum:]_]+?\.dat' -delete
  • 물론 한 줄에 모두 넣을 수도 있습니다( \첫 번째 줄 끝에서 를 제거).
  • -regextype posix-egrep와 똑같이 작동하는 것 같습니다 -regextype posix-extended.
  • 사용 중인 버전이 를 find지원하지 않는 경우 또는 을 -delete사용하세요 .-exec rm -- {} +-exec rm -- {} ';'
  • 최상위 디렉터리만 검색하려면 를 사용하세요 -maxdepth 1.

관련 정보