Find
為什麼 Alpine 上的“查找”命令似乎需要轉義“?”但不在 Ubuntu 上?
這與錯誤等有關還是應該是這樣?
find ./frontend -mindepth 1 -regex '^./dir1/dir2\(/.*\)?'
適用於 Ubuntu 但不適用於 Alpine (docker)
find ./frontend -mindepth 1 -regex '^./dir1/dir2\(/.*\)\?'
適用於 Alpine (docker) 但不適用於 Ubuntu高山:3.14
Ubuntu:18.04
GNU find
-regex
預設使用Emacs 正則表達式。這可以通過-regextype
特定於 GNU find 的選項進行更改;其他選擇包括 POSIX BRE(基本正則表達式,如 grep 和 sed)和 POSIX ERE(擴展正則表達式,如grep -E
和(幾乎)awk)。BusyBox 查找
-regex
使用 POSIX BRE(regexc
函式的預設值)。因為 BusyBox 的設計很小,所以沒有選擇使用不同的正則表達式語法。FreeBSD、 macOS 和NetBSD預設為 BRE,並且可以通過選項使用 ERE
-E
。POSIX沒有標準化
-regex
。對於您的命令:
- 在 BRE (basic) 中,分組是
\(…\)
. 如果存在零或一運算符\?
,但它是一個可選功能,在使用 Glibc 建構時存在於 BusyBox(我不確定其他 libc)但在 BSD 上不存在。零或一也可以拼寫\{0,1\}
。- 在 Emacs RE 中,分組是
\(…\)
,零或一運算符是?
. 儘管 Emacs 本身也支持\{0,1\}
表示零或一,但 GNU find 的 Emacs 正則表達式語法不支持。- 在 ERE(擴展)中,分組是
(…)
,零或一運算符是?
。
find
如果您需要該實現的各種實現之間的可移植性-regex
,您需要堅持在 GNU find 的 Emacs 語法中拼寫相同的 POSIX BRE 構造(為了 BusyBox)。這意味著沒有零或一運算符。find ./frontend -mindepth 1 \( -regex '^./dir1/dir2/.*' -o -regex '^./dir1/dir2' \)
或者,或者,安排傳遞
-regextype posix-basic
給 GNU 查找。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
anddir2
是純字元串而不是正則表達式,則您沒有任何用處-regex
,您可以只寫find ./frontend/dir1/dir2 -maxdepth 1