Find

為什麼 Alpine 上的“查找”命令似乎需要轉義“?”但不在 Ubuntu 上?

  • November 30, 2021

這與錯誤等有關還是應該是這樣?

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\}'

如果dir1anddir2是純字元串而不是正則表達式,則您沒有任何用處-regex,您可以只寫

find ./frontend/dir1/dir2 -maxdepth 1

引用自:https://unix.stackexchange.com/questions/679615