정규 표현식으로 find를 올바르게 사용하는 방법은 무엇입니까?

정규 표현식으로 find를 올바르게 사용하는 방법은 무엇입니까?

-regex옵션 과 함께 find의 올바른 사용법을 알 수 없습니다 .

예를 들어, 다음 예에서는:

Morcheeba/Big Calm/02 Shoulder Holster.flac
Morcheeba/Big Calm/02. Shoulder Holster.flac

path/to/file/## filename.ext점 없이 형식의 문자열만 일치시키고 싶습니다 .

나는 다음을 시도했습니다.

find Morcheeba/ -regextype egrep -iregex ".*[0-9]{2}*[a-z]*flac$"

그리고 약간의 변형이 있지만 항상 모든 파일을 얻거나 아무것도 얻지 못합니다.

뭐가 문제 야?

미리 감사드립니다.

답변1

-regex/ (GNU 확장자) 는 파일 이름뿐만 아니라 전체 경로의 -iregex표준 일치와 같습니다 .-path

해당 파일을 찾고 싶다면이름(반대로)는 소수점 이하 2자리로 시작하고 그 뒤에 소수점이 아닌 숫자가 오고 로 끝나는 경우 .flac이식 가능합니다.

find . -name '[0-9][0-9][!0-9]*.[fF][lL][aA][cC]'

01.flac일치할 수 없기 때문에 일치하지 [!0-9]않습니다. 대신 다음과 같이 작성할 수 있습니다.

find . -name '[0-9][0-9][!0-9]*' -name '*.[fF][lL][aA][cC]'

정규 표현식이 아닌 와일드카드 패턴을 사용합니다.

findGNU 를 사용하려면 -iregex다음과 같습니다.

find . -regextype egrep -iregex '.*/[0-9]{2}[^0-9/][^/]*\.flac'
find . -regextype egrep -iregex '.*/[0-9]{2}([^0-9/][^/]*)?\.flac'

즉, 정규 표현식의 나머지 부분이 /.

답변2

@steeldriver가 제안한 대로 정규식이 .*[0-9]{2}[^.]*\.flac제대로 작동했습니다.

관련 정보