내 정규식에 어떤 문제가 있는지 알 수 없습니다. 에서는 작동하는 것처럼 보였지만 grep
지금은 작동하지 않습니다 find
. TV 프로그램의 일반적인 표현을 따르는 모든 파일을 찾으려고 합니다.S02E21.
find -E . -name '.*[sS]{1}[0-9]{1,2}[\.]?[eE]{1}[0-9]{1,2}.*\.mkv'
어떤 결과도 얻지 못하지만 find
와 동일한 정규식을 사용하면 ls|grep -E '....'
파일이 예상대로 발견됩니다.
답변1
-name
필요와일드카드 패턴는 정규 표현식이 아니며 전체 경로가 아닌 파일 이름과 일치합니다. 정규식 일치에는 -regex
(또는 )를 사용 -iregex
하지만 전체 경로와 일치합니다. 여기에서 다음을 수행할 수 있습니다.
LC_ALL=C find -E . -iregex '.*s[0-9]{1,2}\.?e[0-9]{1,2}[^/]*\.mkv'
여기서는 두 번째 패턴을 /가 아닌 일련의 문자인 .*
로 대체하여 패턴이 디렉터리 구성 요소가 아닌 파일 이름과 일치하는지 확인합니다.[^/]*
로케일을 C로 고정하여LC_ALL=C
.
, 모든 바이트 및 [^/]
를 제외한 모든 바이트가 일치하는지 확인합니다 . /
그렇지 않으면 로케일과 다른 문자 집합으로 인코딩된 파일 또는 디렉터리 이름에 문제가 발생할 수 있습니다. 로케일을 C로 수정하면 and ( 및 ) 및 e
만 일치하도록 보장됩니다 .e
E
s
s
S
-iregex
백 [\.]
슬래시나 점이 일치합니다. 포인트를 일치시키려면 \.
또는 [.]
. 또한 단순화를 위해 제거한 x{1}
것과 동일합니다 .x
{1}
확인하다당신의 매뉴얼 페이지더 알아보기. 둘 다 또는 아님 -E
을 참고하세요 .-regex
-iregex
기준.
다음과 같이 단순화될 수 있다
LC_ALL=C find -E . -iregex '.*s[0-9]{1,2}\.?e[0-9][^/]*\.mkv'
두 번째 숫자가 하나라도 있으면 어쨌든 일치합니다 [^/]
.
와일드카드 패턴을 사용하는 표준은 다음과 같습니다.
LC_ALL=C find . -name '*[sS][0-9][0-9].[eE][0-9]*.mkv' \
-o -name '*[sS][0-9].[eE][0-9]*.mkv' \
-o -name '*[sS][0-9][0-9][eE][0-9]*.mkv' \
-o -name '*[sS][0-9][eE][0-9]*.mkv'
확장 정규식과 달리 와일드카드 패턴에는 대체 연산자나 이에 상응하는 ?
또는 가 없으므로 {n,p}
모든 가능성을 포괄하려면 4가지 패턴이 필요합니다.
다음과 같은 재귀 와일드카드 및 고급 와일드카드 패턴과 함께 셸을 사용할 수도 있습니다 zsh
.
setopt extendedglob
ls -lrtd -- **/(#i)*s<->e<->*.mkv
**/
재귀 검색(#i)
대소문자를 구분하지 않는 일치<->
임의의 소수
여기에 전달하면 ls -lrtd
마지막 수정 시간을 기준으로 정렬된 세부 정보가 포함된 목록이 인쇄됩니다. 물론 모든 명령을 사용할 수 있습니다.
답변2
find dir -name
와 같은 쉘 파일 이름 glob 문자만 지원됩니다 man fnmatch
.
일부 조회 구현은 정규식에 대한 비표준 확장을 지원합니다. 매뉴얼 페이지를 확인하십시오 find
.