찾기의 정규식 - OS X

찾기의 정규식 - OS X

내 정규식에 어떤 문제가 있는지 알 수 없습니다. 에서는 작동하는 것처럼 보였지만 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만 일치하도록 보장됩니다 .eEssS-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.

관련 정보