
[0-9A-Z]{1,2}_\d{4}_\w+?\.dat
예를 들어, A1_2001_pm23aD.dat
, 와 같이 이름이 일치하는 파일을 유지하고 K_1998_12.dat
나머지는 제거하고 싶습니다 .
그러나 ls
및 rm
명령은 이러한 정규 표현식을 지원하지 않습니다. 어떻게 해야 하나요?
답변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
.