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-01
grep -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 filename
example.xml
実際には、\;
シャットダウン-exec
コマンドに置き換えることで、単一の呼び出しに複数のファイルを渡すこと+
ができます。これにより、開始する必要があるプロセスの数が減るため、タスク全体が高速化されます。find
grep
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep "videoplayer.1" {} \+
grep
または、処理中のファイル名がリストされていることを確認するには、この-H
フラグを使用できます(少なくともGNUおよびBSDではgrep
)。
-H, --with-filename
一致する各ファイル名を印刷します。検索するファイルが複数ある場合のデフォルト設定です。
(別の方法は、与えられたファイルのリストに-H
このようなものを追加することです)/dev/null
grep