新しい10年:「find /path/ -name 'file.20{19,20}*」のようなことを言う方法(ただしうまくいきます)

新しい10年:「find /path/ -name 'file.20{19,20}*」のようなことを言う方法(ただしうまくいきます)

要約:

  1. 特定のシステムには、名前を含む多くのテキストファイルがあります~= [type of file].[8-digit date]
  2. これらのファイルを検索するには、次の慣用語を使用することをお勧めします(そして維持したい)。 (find /path/ -name 'file.nnnn*' -print | xargs -e fgrep -nH -e 'text I seek'ここでnnnn==年は4桁)
  3. ...過去10年間、私はfind長年にわたってグローバルコラボレーションを行いました。find /path/ -name 'file.201[89]*' -print | xargs ...
  4. find...しかし、2019年と2020年には使用できません。find /path/ -name 'file.20{19,20}*' -print | xargs ...
  5. ...「中かっこワイルドカード」(正確な用語?)はうまく機能しますがls

find事後整理せずに何をしたいのかfind(例:私が今やっていること)を知らせる{簡潔でエレガントな}方法はありますか?

find /path/ -name 'file.*' -print | grep -e '\.2019\|\.2020' | xargs ...

? FWIW、私はxargs

詳細:

私が取り組んでいるシステムには、以前から存在しており、変更できない多くの慣習があります。その1つは、~= [type of file].[8-digit date]たとえばという名前のテキストファイルがたくさんあることです。私は通常、woohoo_log.20191230このファイルから特定のテキストを検索するときに慣用語find ... grep(通常はEmacsを使用M-x find-grep)を使用します。 (FWIW、これはLinuxシステムです。

$ find --version
find (GNU findutils) 4.4.2
...
$ bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)

現在、必要に応じて変更できる状態はありません。 )私はしばしば現在の仕事の年の範囲を知っているので、find(作業速度を上げるために)返される項目を制限しようとします。

find /path/ -type f -name 'file.nnnn*' -print | xargs -e fgrep -nH -e 'text I seek'

ここでnnnn== 4桁の年です。私の好きな(そして維持したい)このWFMは上記のイディオムを使います。特に長年の検索にも使えるからです。

find /path/ -type f -name 'file.201[89]*' -print | xargs ...

しかし、新しい10年が経つにつれて、そのような習慣が壊れているようで、(少なくとも私にとっては)最も奇妙なことはこれです。 (過去10年間で状況が変わったとき、私はここにいませんでした。)私が望むテキストを選択するとしましょう。知る2019年ファイル&&2020年ファイルにあります(つまり、ファイルを開いてテキストを表示できます)。私が今これをするなら

find /path/ -name 'file.20{19,20}*' -print | xargs ...

grep予期しない/迷惑なことをしたwith no matches found理由は次のとおりです。

$ find /path/ -name 'file.20{19,20}*' -print | wc -l
0

しかし、私がそうするなら

find /path/ -type f -name 'file.*' -print | grep -e '\.2019\|\.2020' | xargs ...

grep期待される結果を返します。いいのに…うーん…特にこの「中かっこグローブ」のため見苦しいです(この使い方が正しくないか、もう使われていない場合は修正してください) 仕組みls!つまり、関連する年の範囲内(たとえば、2019..2020)内の文書が表示されます。

ls -al /path/file.20{19,20}*

したがって、私は知りたいです:

  1. findこのユースケースに正しいglobを提供していませんか?それができる/正しいことをfindするために何を言うべきですか?ls
  2. これが問題ですかxargs?そのfind ... -exec場合は解決策を受け入れることができますが...私の脳は同じ状況でうまく機能するので、可能であればそれに固執することをお勧めしますxargs。 (私は精神遅滞者と言えますが、-exec文法は脳を痛める.)

ベストアンサー1

を使用すると、10進数の範囲に一致するzsh再帰ワイルドカードと対応するワイルドカード演算子を使用できます。<x-y>

grep -nHFe 'text I seek' /path/**/file.<2019-2020>*(D-.)

(隠しディレクトリも表示(D)できます。望まない場合は、おそらく省略して次のように制限できます。Dfind-.定期的なファイル(.)はシンボリックリンク解析()の後に識別されます-

これはon file.00002020(2019から2020の間の10進数であるため)とも一致し、onメソッドと同様にwhich matchと一致しますfile.20201234file.2020file.<2019-2020>1234*

標準(POSIXshとユーティリティ)のアプローチは次のとおりです。

find /path \( -name 'file.2019*' -o -name 'file.2020*' \) -type f \
  -exec grep -Fne 'text I seek' /dev/null {} +

(追加された効果は/dev/nullGNUのファイル名の強制表示と同じです。)grep-H

の出力は、find -printの予想入力形式と互換性がありませんxargs。 GNUユーティリティを使用するとfind -print0およびを使用できますが、動作は同じで、より短く、移植性が高いxargs -r0ため、必須ではありません。find -exec ... {} +

おすすめ記事