Alpine에서 "find" 명령이 "?"를 탈출해야 하는 것처럼 보이지만 Ubuntu에서는 그렇지 않은 이유는 무엇입니까?

Alpine에서 "find" 명령이 "?"를 탈출해야 하는 것처럼 보이지만 Ubuntu에서는 그렇지 않은 이유는 무엇입니까?

이것은 버그 등과 관련이 있습니까, 아니면 상황이 이렇게 되어 있어야 합니까?

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에서 발견함-regexPOSIX 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이 구현의 다양한 구현 간에 이식성이 필요한 경우 -regexGNU 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\}'

dir1and 가 일반 문자열이고 정규 표현식이 아닌 경우 dir2에는 아무 용도도 얻지 못할 것입니다 -regex. 그냥 쓸 수 있습니다.

find ./frontend/dir1/dir2 -maxdepth 1

관련 정보