2017-11-29 9 views
0

頻繁に記載された条件を のファイルのリストを生成したいと思います。いくつかの文字列のすべてと複数の文字列のうちのどれかを含むファイルのcaseless grepのリストの名前

fcntlまたは名前空間を使用せずに、著作権とメインがあるファイル( )をすべて検索したいとします。ここで

は不器用なアプローチです:

fgrep -i -r -l copyright *|xargs fgrep -i -l main|xargs fgrep -i -l -v fcntl|xargs fgrep -i -l namespace 

は標準ユーティリティを使用して、より洗練されたアプローチと同じ結果を達成するためにどのように誰もが知っていますか?

楽しいことに、私は自分のC++ 17プログラムを書いて、スピードの速い結果を達成し始めましたが、自分の仕事が不要であることを知りたいです。ここではそのコードと私のGitHubリポジトリで次のように(GNU)のgrepで

https://github.com/jlettvin/Greased-Grep

+1

これをより強固にし、ファイル名に任意の文字を許可するには、そのグレップは(-0)ことを期待しNULバイト(-Z)を含むファイル名とxargsのを隔てる必要とすることができます'grep -lv 'pattern'はあなたがしたいことをしていると思う。あなたは '' pattern'を含んでいないファイルを望んでいますが、 '' pattern'とマッチしない行を含むファイルです。通常はすべてのファイルです。 –

答えて

2

が、私はこれを行うだろう:

grep -Flir 'main' . \ 
    | xargs grep -Fli 'copyright' \ 
    | xargs grep -FLi -e 'fcntl' -e 'namespace' 

これは、あなたが持っていたものと非常によく似ています。ファイルがのパターンを含むでない場合は、-Lオプションを使用します(一致しない行、つまり通常はすべてのファイルを含むファイルを返す-lv –を試しました)。

最後の手順では、一致しないファイルを除いて、grep呼び出しを1回だけ行い、複数のパターンを-eで指定して実行できます。 「私はドン

grep -FlirZ 'main' . \ 
    | xargs -0 grep -FliZ 'copyright' \ 
    | xargs -0 grep -FLi -e 'fcntl' -e 'namespace' 
関連する問題