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

Ubuntu: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または1つの演算子はです?

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

関連情報