점 문자를 사용하여 개행 문자를 일치시키기 위해 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에서 기본적으로 개행 문자와 일치합니다 .
.
다시 말하지만, 간단한 패턴의 경우 -name
which를 사용하여 쉘 전역 변수를 취할 수 있습니다(그리고 개행 문제가 있어서는 안 됩니다).
이는 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
더 쉬울 수 있음을 의미합니다.