検索:名前の正規表現

検索:名前の正規表現

私が次のように書いているとしましょう。

find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"

私の考えでは、このコマンドが機能しなければならないと思います。さまざまな正規表現タイプオプションとさまざまな正規表現形式を繰り返しましたが、照会を通じてこの正規表現を機能させることはできません。ここで find と正規表現パーサーに関して簡単なミスをしていますか?

答え1

検索には-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

別のオプションは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オプションの利点を享受できます。

関連情報