newermtファイルの検索とgrepファイルの内容が機能しない

newermtファイルの検索とgrepファイルの内容が機能しない

Linux find コマンドと grep コマンドの使用に問題があります。デフォルトでは、CDをディレクトリに挿入し、特定の日付以降に変更されたすべてのexample.txtファイルを繰り返し検索し、そのファイルをgrepする必要があります。以下のコマンドはある程度動作しますが、同じファイルに対して複数の結果を提供するので、どのくらい安定しているかわかりません。

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;

答え1

私の考えに正しいコマンド形式は次のとおりです。

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" {} \;

コマンド{}の一部がありませんfind。検索結果はgrepに渡されません。

答え2

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;

これにより、find現在のディレクトリから始まり、./-nameが更新された(変更時に)example.xmlすべてのファイルに対してコマンドが実行されます。2018-01-01grep -r "videoplayer.1" /.

しかし、私たちはgrepコマンドが実行されることがわかりますいいえ見つかったファイル名が考慮されますが、findコマンドは常に同じです。しかも-r始まりはファイルシステムのルート/.)。さて、これはスペルエラー(./vs. /.)かもしれませんが、意味は完全に異なります。

を使用してもgrep -r ... ./検索は現在のディレクトリで繰り返し開始されますが、を使用すると現在のディレクトリで-exec検索が開始されます。find

を使用している場合は、プレースホルダをfind -exec使用して現在処理中のファイル名を挿入する場所を{}知る必要があります。findだから

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep  "videoplayer.1" {} \;

2018年1月1日以降、名前が付けられたすべてのファイルで実行されます。grep videoplayer.1 filenameexample.xml

実際には、\;シャットダウン-execコマンドに置き換えることで、単一の呼び出しに複数のファイルを渡すこと+ができます。これにより、開始する必要があるプロセスの数が減るため、タスク全体が高速化されます。findgrep

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep  "videoplayer.1" {} \+

grepまたは、処理中のファイル名がリストされていることを確認するには、この-Hフラグを使用できます(少なくともGNUおよびBSDではgrep)。

  -H, --with-filename       

一致する各ファイル名を印刷します。検索するファイルが複数ある場合のデフォルト設定です。

(別の方法は、与えられたファイルのリストに-Hこのようなものを追加することです)/dev/nullgrep

関連情報