このfind式で私が何を間違えましたか?
; touch ook ooks
; find . -name 'ook' -or -name 'ooks' -type f
./ook
./ooks
; find . -name 'ook[s]?' -type f
[returns nothing]
; echo $?
0
答え1
正規表現とシェル検索パターンを混同しています。
?シェルの単一文字を表します。
?正規表現では、前の文字(または子パターン)がオプションであることを示します。
努力する:
find . -regex '.*ooks?' -type f
検索マニュアルページから:
-正規表現パターン ファイル名が正規表現パターンと一致します。これはゲームです 検索する代わりにフルパスを使用してください。たとえば、ファイルを一致させるには 「./fubar3」という名前の正規表現「.*bar」を使用できます。または '.*b.*3' ですが、'f.*r3' ではありません。正規表現の理解 find のデフォルトは Emacs 正規表現ですが、動作します。 これを変更するには、-regextype オプションを使用します。
答え2
この回答は少なくともGNU検索に適用されます。
-name
マッチングにシェルパターンを使用します。正規表現の一致を実行するには、次のようにします-regex
。
find . -regex '.*ook[s]?' -type f
-regex
フルパスを一致させるには、emacs正規表現を使用します。正規表現の種類は変更されることがあります-regextype
。