これはバグなどに関連していますか、それとも状況がこのようになっているべきですか?
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で発見-regex
POSIX 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
この実装のさまざまな実装間で移植性が必要な場合は、-regex
GNU 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\}'
dir1
andが通常の文字列で正規表現でない場合は、dir2
何も使用できません-regex
。ただ書くことができます。
find ./frontend/dir1/dir2 -maxdepth 1