私が書いたとしましょう:
find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
このコマンドは動作するように見えます。さまざまなregextypeオプションとさまざまなregex形式を繰り返しましたが、この種の正規表現をfindで機能させることができません。 findと正規表現パーサーに関して私がここで間違っている単純なものはありますか?
Findの-name
は正規表現を使用しません(これは質問の元のバージョンで使用されていました)。シェルグロブが必要ですが、これは有効なシェルグロブではありません。 -regex
テストを使用したいが、拡張正規表現または{N}
およびfoo|bar
表記を理解する他のフレーバーを使用するように指示する必要もあります。最後に、-name
とは異なり、-regex
テストはパス名全体を調べるため、次のようなものが必要です。
$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz
-name
を使用する場合は、次のようにします。
find . \( \
-name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
-o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
\) -printf "%f\n"
(少なくともこのフォルダに)妥当なファイル名がある場合、次のように実行できます。
find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'
これにより、さまざまなgrepオプションを利用できます。