特定の日付からファイル内の特定の文字列を検索するにはどうすればよいですか?
たとえば、次の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つの方法は、タイムスタンプファイルを設定して、探している日付をまとめることです。
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は決して一致しないため、報告されません)。
出力は、ファイル名とそれらのファイルの一致する行になります。
使用できます
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
の場合のようにブラケットファイルを削除することを覚えておく必要はありません。