find 명령에 대해 정규식에 수정자를 사용합니까?

find 명령에 대해 정규식에 수정자를 사용합니까?

점 문자를 사용하여 개행 문자를 일치시키기 위해 find 명령과 함께 정규식을 사용하려고 합니다. 이는 일반적 s으로 수정자를 사용하여 수행됩니다. 그러나 정규식 엔진마다 형식이 다르므로 find 명령이 개행과 일치하도록 정규식을 작성하는 방법을 정확히 알 수 없습니다. 예를 들어, 이름에 줄 바꿈이 있는 파일을 포함하여 모든 파일과 일치하도록 다음 간단한 명령을 어떻게 변경합니까?

find /home/user -regex ".*"

나는 이것을 시도했고 "(?s).*"아마도 "/.*/s"다른 몇 가지도 시도했을 것입니다.

답변1

내 버전의 GNU find는 다음을 사용하여 선택할 수 있는 여러 가지 정규식 변형을 지원합니다 -regextype.

유효한 유형은 "findutils-default", "awk", "egrep", "ed", "emacs", "gnu-awk", "grep", "posix-awk", "posix-basic", "posix-"입니다. " egrep', 'posix-extend', 'posix-minimal-basic', 'sed'.

거의 모든 것이 도트 매치 개행 문자를 만듭니다... 제외하고는 emacs이것이 기본값입니다.

그러니 다른 것을 사용하세요. posix-extended충분히 제정신일 수도 있습니다.

$ touch hello $'new\nline'
$ find . -type f -regex '.*'
./hello
$ find . -type f -regextype posix-extended -regex '.*'
./hello
./new?line

다른 달리기를 실행하는 경우 find마일리지가 다를 수 있습니다. 빠른 테스트 후에는 내 Mac에서 기본적으로 개행 문자와 일치합니다 ..

다시 말하지만, 간단한 패턴의 경우 -namewhich를 사용하여 쉘 전역 변수를 취할 수 있습니다(그리고 개행 문제가 있어서는 안 됩니다).

이는 PCRE/Perl 정규식의 기능처럼 보이지만 지원되지는 (?s)않습니다 . find의 경우 원시 모드만 /.*/s가능 find하며 구분 기호가 없으므로 후행 옵션이 없습니다.

답변2

주문하다

find ~user

개행 문자가 포함된 이름을 포함하여 모든 이름이 검색됩니다. -type f일반 파일만 찾고 싶다면 추가하세요.

이름 일치를 제한하지 않으려면 이름에 대한 테스트를 사용하지 마세요.

하위 문자열 일치를 사용하여 이름을 제한하려면 -name테스트에서 와일드카드 패턴을 사용할 수 있습니다. *둘 다 ?일반 쉘과 -name테스트 모두에서 와일드카드 패턴의 개행과 일치합니다 find.

표준을 사용한 예 find:

$ find . -name 'file?name'
./file
name
$ find . -name 'file*name'
./file
name
$ find . -name 'd*name'
./dir
name
$ echo ./d*name
./dir
name

오해된 질문에 대한 답변("개행 문자가 포함된 이름을 찾는 방법"):

사용 표준 find:

find ~user -name '*
*'

이를 지원하는 쉘에서는 "C-문자열"을 사용하십시오(여전히 표준을 사용함 find).

find ~user -name $'*\n*'

GNU에서 일반적으로 사용할 수 있는 내장 정규식 유형은 find개행 문자와 일치 할 수 없으므로 \n위의 와일드카드 패턴과 같이 리터럴 개행 문자만 사용할 수 있습니다. 이는 -name이식 불가능한 테스트보다 표준 테스트를 사용하는 것이 -regex더 쉬울 수 있음을 의미합니다.

관련 정보