Linuxのfindコマンドとgrepコマンドに問題があります。基本的に、ディレクトリにCDを挿入し、特定の日付以降に変更されたすべてのexample.txtファイルを再帰的に検索して、それらのファイルに対してgrepを実行する必要があります。以下のコマンドは(ある程度)機能していますが、同じファイルで複数の結果が得られ、どれほど安定しているかわかりません。
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;
これによりfind
、現在のディレクトリから開始して、(変更時に)新しい./
-nameexample.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
コマンドを終了するをa+
に置き換えて、find
1回の呼び出しに複数のファイルを渡すことができますgrep
。開始する必要のあるプロセスが少なくなるため、ジョブ全体が高速になります。
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep "videoplayer.1" {} \+
また、grep
処理しているファイルの名前を確実にリストしたい場合は、-H
フラグを使用できます(少なくともGNUとBSDgrep
では)。
-H, --with-filename
一致するたびにファイル名を出力します。これは、検索するファイルが複数ある場合のデフォルトです。
(の代わりに、に与えられたファイルのリストに-H
次のようなものを追加すること/dev/null
もできますgrep
)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加