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


297

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

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

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


7
정규식을 바꿀 수도 있습니다. 기본값은 Emacs Regular Expressions 입니다.
pavium

답변:


348
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'.

4
@ Tom은 정규식이 작동하는 방식입니다. 매뉴얼 페이지에 따르면 정규 표현식은 전체 파일 경로, 디렉토리 포함과 일치하므로 정규 표현식을 암시 적으로 의미 "^ ... $"합니다. 전체 결과 행과 일치해야합니다.
매니 D

2
나는 거의 모든 문자와 0 이상 일치 하기 때문에 /in 이 필요하다고 생각하지 않습니다 . .*/.*
Jeff

2
: 제대로 처음 정규식을 읽어 보지 않았 사람 (나 같은) 사람들을 위해 : 예를 들어 특수 정규식 문자 앞에 백 슬래시를 참고\{36\}
루카스 윌슨 - 리히터

11
정규식 유형의 전체 목록을 찾는 데 문제가있었습니다 (맨 페이지가 최신 상태가 아님).valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
Noah Sussman

4
풋해야합니다 -regextype플래그를 하기 전에-regex 그렇지 않으면 적용되지 않습니다, 플래그!
Christopher Orr

84

-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에서도 기본값입니다.)


1
정규식에서 여러 일치하는 문자열에 괄호가 있었으므로 posix-egrep유형이 효과적이었습니다.
palswim

2
주목할 것은 BSD가 아닌 -regextypeGNU에 대한 옵션입니다 find(적어도 Mac BSD와 같지 않음) find. 이 옵션을 사용할 수 없으면 GNU find를 설치하십시오. Mac의 경우 brew package로 가능합니다 findutils. 그런 다음를 통해 찾기를 사용할 수 있습니다 gfind.
DanCat

regextype posix-egrep이 나를 위해 작업을 수행했습니다. 나는 기본값이 regextype emacs라고 생각합니다.
infoclogged 님의

35

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

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

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

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


나를 위해 잘 작동하고 정규식과 관련하여 큰 자유를 제공합니다.
glaucon

3
이 갖는 단점은 이용하지 수 있다는 것입니다 find'의 -prune모두 특정 디렉토리를 건너 것이다 기능. 대부분 이것이 중요하지는 않지만 언급 할 가치가 있습니다.
Alexander Bird

자두가 여전히 작동합니다. -exec를 사용하는 것이 더 위험합니다-grep이 허용하는 파일뿐만 아니라 모든 파일에서 실행됩니다.
tpb261

13

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

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

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


보인다 -E우분투 (WSL 우분투에서 테스트)에 사용할 수 없습니다
호전적인 침팬지

2
@Clever Little Monkey-아니요, 허용 된 답변은 Ubuntu에서 작동해야합니다.이 변형은 Mac OS X 용 (또는 FreeBSD와 같은 다른 BSD 변형)
Stan Kurdziel

8

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

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

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


8

간단한 방법-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)

6

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

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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.