シェルのextglobシェルオプションを使用してfindを実行する方法はありますか?

シェルのextglobシェルオプションを使用してfindを実行する方法はありますか?

要するに、これら2つのファイルを見つけて階層を下に下げるprefix.extために本能的にこのような命令を書いたのです。prefix_suffix.ext

find /some/path -type f -name 'prefix?(_suffix).zip'

しかし、うまくいきません。

man find、内部的にはモードを「シェルモード」と呼ぶので、どのモードを使用するかを制御できるか、特にオプションを使用できるかどうか疑問に-name patter思います。extglob

答え1

find「デフォルト」シェルパターンのみを使用してください。POSIXに規定されているように。 -style globをサポートしていませんextglob(GNU実装ではfnmatchGNU C ライブラリの実装はfnmatch拡張モードをサポートします。)。

GNUを使用している場合は、find正規表現を使用してフィルタリングできます。文書の関連部分詳細:

-regex '.*/prefix\(_suffix\)?\.zip'

デフォルトの正規表現型を使用するか、

-regextype posix-extended -regex '.*/prefix(_suffix)?\.zip'

EREで。

答え2

他の人がすでに指摘したように、このユーティリティは基本的にシェルや他のもの(元のシェルから継承されています)に見られる拡張グロービングパターンをfindサポートしていません。bashksh

あなたはできます使用bash次のテストを実行するシェル:

find /some/path -type f \
    -exec bash -O extglob -c '[[ ${1##*/} == prefix?(_suffix).zip ]]' bash {} \; \
    -print

bashただし、調査するファイルごとにプロセスを作成する必要があるため、これは非常に非効率的です。 1つ以上の一般的なパターンを使用して拡張ワイルドカードパターンをオーバーライドする方が合理的です。

find /some/path -type f \
    \( -name prefix.zip -o -name prefix_suffix.zip \) \
    -print

これは、移植性に優れ、理解しやすいという利点がある。

答え3

別の答えでは正規表現に言及しましたが、これは確実な解決策をもたらしました。-regex代わりに使用してください-name

find /some/path -type f -regex '.*/prefix\(_suffix\)?\.zip'

少し遅くなるかもしれませんが、それほど多くないかもしれません。

関連情報