[regex] find 명령으로 정규식을 사용하는 방법은 무엇입니까?

생성 된 uuid1 문자열로 이름이 지정된 이미지가 있습니다. 예를 들어 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg입니다. “find”명령을 사용하여 이러한 이미지를 모두 찾고 싶습니다.

find . -regex "[a-f0-9\-]\{36\}\.jpg".

그러나 작동하지 않습니다. 정규식에 문제가 있습니까? 누군가 나를 도와 줄 수 있습니까?



답변

find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

전체 경로와 일치 .*/하므로 처음 에 지정해야 find합니다.

예:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

내 버전 찾기 :

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0)
susam@nifty:~/so$
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.


답변

-regex찾기 표현식은 일치 전체 이름 현재 디렉토리에서 상대 경로를 포함하여. 이를 find .위해서는 항상로 시작하고 ./모든 디렉토리로 시작 하십시오.

또한 이들은 emacs정규 표현식이며 일반적인 egrep 정규 표현식과 다른 이스케이프 규칙이 있습니다.

이것들이 모두 현재 디렉토리에 직접 있다면

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'

작동해야합니다. (정확하지는 않습니다. 여기서 반복 계산을 수행 할 수 없습니다.) 다음과 같이 egrep 표현식으로 전환 할 수 있습니다 -regextype posix-egrep.

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'

(여기서 말한 모든 것은 GNU 찾기를위한 것이므로, BSD에 대해서는 Mac에서도 기본값입니다.)


답변

다른 답변으로 판단하면 이것이 잘못된 것 같습니다.

그러나 대신 다음과 같이 할 수 있습니다.

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

grep을 약간 조정하고 원하는 것에 따라 다른 옵션을 사용해야 할 수도 있지만 작동합니다.


답변

Mac OS X (BSD 찾기) : 허용되는 답변과 동일하며 .*/접두사는 전체 경로와 일치해야합니다.

$ find -E . -regex ".*/[a-f0-9\-]{36}.jpg"

man find-E확장 정규식 지원을 사용 한다고 말합니다.


답변

셸에서 문자열 이스케이프를 피하려면 작은 따옴표 ( ‘)를 사용하십시오. 표현식은 전체 경로와 일치해야합니다. 즉, 다음과 같아야합니다.

 find . -regex '\./[a-f0-9-]*.jpg'

그 외에도 내 발견 (GNU 4.4.2)은 기본 정규 표현식, 특히 {36} 구문은 아는 것만 아는 것 같습니다. 나는 당신이 그것을하지 않고해야 할 것이라고 생각합니다.


답변

간단한 방법-find는 전체 경로와 일치하므로 처음에. *를 지정할 수 있습니다.

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'

버전 찾기

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION
FTS(FTS_CWDFD) CBO(level=2)


답변

정규식으로 찾기 명령을 적용 할 때는 절대 디렉토리 경로를 사용해야합니다. 귀하의 예에서

find . -regex "[a-f0-9\-]\{36\}\.jpg"

로 변경해야합니다

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

대부분의 Linux 시스템에서 정규식의 일부 분야는 해당 시스템에서 인식 할 수 없으므로 다음과 같이 명시 적으로 지적해야합니다.

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"