検索: 名前の正規表現

検索: 名前の正規表現

次のように書いたとします:

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'

https://github.com/sharkdp/fd

答え3

適切なファイル名(少なくともこのフォルダ内)がある場合は、次のようなものを実行できます。

 find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

この方法では、さまざまな grep オプションを活用できます。

関連情報