这是否与错误等有关,或者事情本来应该如此?
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 设计得很小,因此无法选择使用不同的正则表达式语法。
自由BSD、macOS 和网络BSD默认为BRE,并且可以通过该-E
选项使用ERE。
POSIX不标准化-regex
。
对于您的命令:
- 在 BRE(基础)中,分组是
\(…\)
.零或一运算符(\?
如果存在)是存在的,但它是一个可选功能,在使用 Glibc 构建时存在于 BusyBox 中(我不确定其他 libc),但在 BSD 上则不存在。零或一也可以拼写\{0,1\}
。 - 在 Emacs RE 中,分组是
\(…\)
,零或一运算符是?
。尽管 Emacs 本身也支持\{0,1\}
表示零或一,但 GNU find 的 Emacs 正则表达式语法却不支持。 - 在 ERE(扩展)中,分组是
(…)
,零或一运算符是?
。
find
如果您需要该实现的各种实现之间的可移植性-regex
,则需要坚持使用 POSIX BRE 构造(为了 BusyBox),它们在 GNU find 的 Emacs 语法中拼写相同。这意味着不存在零或一运算符。
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
和dir2
是普通字符串而不是正则表达式,那么您不会从中得到任何用处-regex
,您可以只写
find ./frontend/dir1/dir2 -maxdepth 1