이것은 버그 등과 관련이 있습니까, 아니면 상황이 이렇게 되어 있어야 합니까?
find ./frontend -mindepth 1 -regex '^./dir1/dir2\(/.*\)?'
Ubuntu에서는 작동하지만 Alpine에서는 작동하지 않습니다(docker).
find ./frontend -mindepth 1 -regex '^./dir1/dir2\(/.*\)\?'
Alpine(docker)에서는 작동하지만 Ubuntu에서는 작동하지 않습니다.
알파인: 3.14
우분투: 18.04
답변1
그들은 사용한다정규식의 다양한 구문.
GNU에 의해 발견됨-regex
사용Emacs 정규 표현식기본적으로. 옵션을 통해 변경할 수 있습니다.-regextype
이는 GNU find에만 적용됩니다. 다른 옵션에는 POSIX BRE(grep 및 sed와 같은 기본 정규식) 및 POSIX ERE(및 grep -E
(거의) awk와 같은 확장 정규식)가 포함됩니다.
BusyBox에서 발견함-regex
POSIX BRE 사용(기본값regexc
기능). BusyBox는 작게 설계되었기 때문에 다른 정규식 구문을 사용할 수 있는 옵션이 없습니다.
FreeBSD, macOS 및네트워크BSD기본값은 BRE이며, -E
이 옵션과 함께 ERE를 사용할 수 있습니다.
POSIX표준화되지 않았습니다 -regex
.
귀하의 명령에 대해 :
- BRE(기본)에서 그룹화는
\(…\)
0 또는 1개의 연산자(\?
있는 경우)가 있지만 Glibc로 빌드할 때 BusyBox에 있는 선택적 기능이지만(다른 libcs에 대해서는 잘 모르겠습니다) BSD에는 존재하지 않습니다. 0 또는 1의 철자를 사용할 수도 있습니다\{0,1\}
. - Emacs RE에서 그룹화는
\(…\)
이고 0 또는 1 연산자는 입니다?
. Emacs 자체는\{0,1\}
0 또는 1 표현을 지원하지만 GNU find의 Emacs 정규식 구문은 지원하지 않습니다. - ERE(확장)에서 그룹화는
(…)
, 0 또는 하나의 연산자는 입니다?
.
find
이 구현의 다양한 구현 간에 이식성이 필요한 경우 -regex
GNU find의 Emacs 구문과 철자가 동일한 POSIX BRE 구문(BusyBox용)을 사용해야 합니다. 이는 0개 또는 1개의 연산자가 없음을 의미합니다.
find ./frontend -mindepth 1 \( -regex '^./dir1/dir2/.*' -o -regex '^./dir1/dir2' \)
-regextype posix-basic
또는 GNU find로 전달되도록 준비하십시오 .
case $(find --help 2>/dev/null) in
*-regextype*) find_options='-regextype posix-basic';;
*) find_options=;;
esac
find ./frontend $find_options -mindepth 1 -regex '^./dir1/dir2\(/.*\)\{0,1\}'
dir1
and 가 일반 문자열이고 정규 표현식이 아닌 경우 dir2
에는 아무 용도도 얻지 못할 것입니다 -regex
. 그냥 쓸 수 있습니다.
find ./frontend/dir1/dir2 -maxdepth 1