次のように書いたとします:
find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
このコマンドは動作するように見えます。さまざまな regextype オプションとさまざまな regex 形式を繰り返し試しましたが、この種の regex を find で動作させることができません。find と正規表現パーサーに関して、何か単純な間違いをしているのでしょうか?
答え1
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"
答え2
もう 1 つのオプションは次のfd
ツールです:
fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'
答え3
適切なファイル名(少なくともこのフォルダ内)がある場合は、次のようなものを実行できます。
find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'
この方法では、さまざまな grep オプションを活用できます。