要するに、これら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実装ではfnmatch
、GNU C ライブラリの実装はfnmatch
拡張モードをサポートします。)。
GNUを使用している場合は、find
正規表現を使用してフィルタリングできます。文書の関連部分詳細:
-regex '.*/prefix\(_suffix\)?\.zip'
デフォルトの正規表現型を使用するか、
-regextype posix-extended -regex '.*/prefix(_suffix)?\.zip'
EREで。
答え2
他の人がすでに指摘したように、このユーティリティは基本的にシェルや他のもの(元のシェルから継承されています)に見られる拡張グロービングパターンをfind
サポートしていません。bash
ksh
あなたはできます使用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'
少し遅くなるかもしれませんが、それほど多くないかもしれません。