web-dev-qa-db-ja.com

特定の日付からファイル内の特定の文字列を検索するにはどうすればよいですか?

特定の日付からファイル内の特定の文字列を検索するにはどうすればよいですか?

たとえば、次の3つのファイルがあります。

'a1' dated: 20 Feb,
'a2' dated 21 Feb,
'a3' dated 22 Feb.

ここで、date = '21Feb'であるすべてのファイルで 'JMS111'のような特定の文字列を検索したいと思います。

以下のコマンドを試してみましたが、成功しませんでした:

ls -lt |grep 'JMS111' -ctime 2019/02/21 
find -name '*.xml' -type f -printf '%Tw:%h/%f\0' | grep 'JMS111'
1
Muhammad Kazim

これにアプローチする1つの方法は、タイムスタンプファイルを設定して、探している日付をまとめることです。

touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time

...そしてfindに、開始時刻より新しいがではない終了時刻より新しいファイルを要求します。

find . -type f  -newer /tmp/start-time  ! -newer /tmp/end-time

すべてを一緒に入れて:

touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time
find . -type f -newer /tmp/start-time  ! -newer /tmp/end-time -name '*.xml' -exec grep JMS111 /dev/null {} +
rm /tmp/start-time /tmp/end-time

これにより、名前が.xmlで終わる適切な時間枠のファイルが検索され、それらのファイル名がgrepに渡され、パスごとに可能な限り多くのファイルが入力されます。 grepが検索する「ファイル」として/dev/nullを追加し、findのファイル名があれば、それも一緒に検索します。このように、一致するファイルが1つしかない場合、grepは「強制的に」一致するファイル名を報告します(/ dev/nullは決して一致しないため、報告されません)。

出力は、ファイル名とそれらのファイルの一致する行になります。

3
Jeff Schaller

使用できます

find . -name 'a[123]' -ctime 6 | xargs grep -l 'JMS111'

-ctime 6は、6日経過したファイルを探します。実際には、ファイルの作成日を、コマンドを実行する前の6 * 24時間から7 * 24時間の間の24時間と比較します。作成日がその期間内で、ファイル名が「a1」、「a2」、または「a3」の場合、findはそのファイルのパスを出力します。 -ctime <n>で指定された期間は、findコマンドを実行した時刻に基づいているため、明日findを実行する場合は、今日実行する場合とは異なる値を<n>に使用する必要があります。

注:-ctime -6を使用すると、findは6日以内のファイル名を出力し、-ctime +6は6日以上前のファイル名を出力します。また、findの一部のバージョンでは、6時間前の測定単位(6時間など)を指定できます。

作成時間ではなく変更時間で検索する場合は、代わりに-mtimeを使用できます。

xargsを使用すると、grepを実行する前に、findからファイルの正しいリストを取得しているかどうかを簡単に確認できます。また、grepを-execプライマリに配置すると、findは、見つかったファイルごとに1回呼び出しますが、xargsは、grep、これはリソースをあまり消費しません。

-ctimeの欠点の1つは、ファイルが作成されてからの日数を計算する必要があることですが、実行することでそれを把握できます。

find . -ctime n | xargs ls -l

興味のある日付のファイルが表示されるまで。

...そして、-newerの場合のようにブラケットファイルを削除することを覚えておく必要はありません。

1
hyperbole