Linux "find -regex"는 바인딩을 처리하지 않습니다.

Linux "find -regex"는 바인딩을 처리하지 않습니다.

다음과 같은 파일이 있는데 다음과 같이 일치시켜야 합니다.

./foo.bar1.sh       -match

./qux/foo.bar2.sh   -match

./foo.sh            -match

./baz.sh            -no match

./foo.bar3          -no match

나는 시도했다:

find . -regex ".*foo(bar[0-9])?\.sh"

그러나 아무것도 반환하지 않습니다. 해당 정규식이 작동하지 않는 이유를 알 수 없습니다.

답변1

정규식에 두 가지 오류가 있습니다.

  1. 뒤에 (문자 그대로) 점이 누락되었습니다 foo.

  2. find다음과 같은 경우 괄호를 이스케이프해야 합니다.~ 아니다문자 그대로의 괄호로 사용됩니다.

sh또한 모든 문자와 일치하므로 앞에 점을 이스케이프 처리해야 합니다 .

이제 수정된 명령은 다음과 같습니다.

find . -regex ".*foo\(\.bar[0-9]\)?\.sh"

그런데 오류 2는 내가 find-regex스위치를 좋아하지 않는 이유입니다. 일관성 없는 탈출입니다.

물론 작동하지만 grep -PPCRE(Perl Compatible Regular Expressions)를 사용하므로 더 많은 기능이 있지만 놀라움과 함정은 적습니다.

개인적으로 다음을 사용합니다.

find . | grep -P "foo(\.bar\d)?\.sh"

관련 정보