web-dev-qa-db-ja.com

検索:名前の正規表現

私が書いたとしましょう:

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

このコマンドは動作するように見えます。さまざまなregextypeオプションとさまざまなregex形式を繰り返しましたが、この種の正規表現をfindで機能させることができません。 findと正規表現パーサーに関して私がここで間違っている単純なものはありますか?

4
Christopher

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"
10
terdon

別のオプションはfdツールです。

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

https://github.com/sharkdp/fd

3
Steven Penny

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

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

これにより、さまざまなgrepオプションを利用できます。

2
JJoao