두 개의 폴더가 있고 현재 폴더 아래에 다음이 CA01
있습니다 .CA02
foo
foo -+
|
+-CA01
|
+-CA02
내가 입력할 때
find . -regex ".*CA[0-9]+" -exec echo {} +
또는
find . -regex ".*CA[0-9][0-9]" -exec echo {} +
예상되는 결과는 다음과 같습니다.
./CA01 ./CA02
그런데 입력을 해보니
find . -regex ".*CA[0-9]\{2\}" -exec echo {} +
아무것도 나타나지 않는데 이는 전혀 예상치 못한 일입니다.
기본적으로 find
emacs 정규식을 사용하기 때문입니다. 위의 모든 내용을 사용하여 두 폴더를 일치시킬 수 있습니다.
여기서 뭔가 빠졌나요?
답변1
-regextype
을 반복 횟수를 지원하는 것으로 변경해야 합니다 (예: {2}
). 기본값은 emacs
개수를 지원하지 않는 것 같습니다. 기본 정규식 유형은 반복 횟수에 대한 구문이 없는 이전 버전의 Emacs를 모방합니다. 아래 유형이 저에게 적합한 것 같습니다.
예
posix-egrep
$ find foo -regextype posix-egrep -regex ".*CA[0-9]{2}" -exec echo {} +
foo/CA02 foo/CA01
sed
$ find foo -regextype sed -regex ".*CA[0-9]\{2\}" -exec echo {} +
foo/CA02 foo/CA01
posix 확장
$ find foo -regextype posix-extended -regex ".*CA[0-9]{2}" -exec echo {} +
foo/CA02 foo/CA01
다른 것들도 있지만 더 이상 시도하지 않았습니다. 매뉴얼 페이지를 참조 find
하여 를 검색하십시오 -regextype
.
발췌
-regextype type
Changes the regular expression syntax understood by -regex and
-iregex tests which occur later on the command line. Currently
implemented types are emacs (this is the default), posix-awk,
posix-basic, posix-egrep and posix-extended.
내 버전의 찾기
$ find -version
find (GNU findutils) 4.5.9
Copyright (C) 2010 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 1778ee9e7d0e150a37db66a0e51c1a56755aab4f
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)