テキスト文字列を含まないすべてのファイルを見つけるにはどうすればよいですか?


40

テキスト文字列を含まないすべてのファイルを見つけるために使用できる簡潔なコマンドは何ですか?

私はこれを試してみました(-vを使用してgrepのパラメーターを反転させました)。

find . -exec grep -v -l shared.php {} \;

誰かがこれがうまくいくと言った:

find . ! -exec grep -l shared.php {} \;

しかし、それは私にはうまくいかないようです。

このページには次の例があります。

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

しかし、それは面倒であり、まったく簡潔ではありません。

ps:grep -L *これでうまくいくことはわかっていますが、findコマンドをgrepと組み合わせて除外ファイルにどのように使用すればよいかを知りたいと思っています。

pss:また、grepにgrep -L *構文のサブディレクトリを含める方法がわかりませんが、それを使用する方法を知りたいですfind:)


1
あなたが書いた最初のコマンドは私のコンピューターでうまく機能しました。どのバージョンのfindを使用していますか?我々はそれをしているので、たぶんunixのは、あなたが...実行しているかを指定
rahmu

@rahmu、このコマンドはほとんど常に期待どおりに機能しません。おそらく非常に具体的なケースがあります。unix.stackexchange.com/questions/339619/…を
sgnsajgon

回答:


8
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

または

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

ここでは-c、カウントが0の場合にファイル内の一致する行の数を計算しています(必要なファイル)。したがって、出力から最初の列、つまりファイル名を切り取ります。


6
これは非常に複雑です。ケビンの答えをご覧ください。
ジル「SO-停止されて悪」

@Gillesはい、同意します。私は彼の答えを+1しています。
サチンディベカー

6
これは「非常に複雑」であるだけでなく、パターンに一致する10行の倍数を含むすべてのファイルをリストするため、間違っています。grepこれが修正されたとしても、ファイル名に改行文字が含まれてい:たり改行文字が含まれていなかったりすると仮定します
...-don_crissti

@don_crissti、言及してくれてありがとう!それでも、コピーと貼り付けのコードを大量に使用しない限り、上記のソリューションは非常に素晴らしい仕掛けです。
Ufos

@Ufos-私は本当にあなたのコメントを受け取りません...これは間違っています。とにかく、あなた
にとって

57

-v -l(一致-Lしない行があるファイル)を(一致する行がないファイル)に変更すると、検索は機能するはずですが、grepの再帰(-r)オプションを使用することもできます。

grep -rL shared.php .

どのfindが機能しますか?
cwd

@Kevin-申し訳ありませんが、find . -exec grep -v -l shared.php {} \;(そして私が試した他のすべての亜種も)私のために機能していません。私はOS Xを使用していますが、それが問題になるとは思いません。-rオプションを忘れていたため、+ 1を提供しました。
cwd

@cwd私はこれが古いことを知っていますが、今後の読者のためにここに残しておきたいと思います:あなたがOS Xを使用しているという事実は違いを生みます。Mac OSXはFreeBSDコマンドを使用します。ここでのほとんどの人は、Linux(GNU)スタイルのコマンドを想定しています。それらには、異なる引数、詳細の異なる処理方法があります。
リッチホモルカ

2016年の時点でOSXは、サポートに見えるん-L
デビッド・モグラ

@kevinそれはそうだと言ったが、そうではない。:)誰も明示的にそうではないと言ったわけではありませんが、コメントは紛らわしいものでした(そして確かに他のOS X / BSD対GNUの問題に遭遇しました)。
デビッドモールズ

4

私はそれgrep -L *がこれを行うことを知っていますが、どのようにfindコマンドを組み合わせて使用してgrepファイルを除外することができますか本当に知りたいです

あなたは使用することができますfindし、grepこのように:

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

ここ-printで実行されるのは、前の式:が! -exec ... {}asとして評価される場合のみですtrue
そのため、見つかったファイルごとにut grep -q 'PATTERN'が実行され、exec結果がfalse式全体である場合に! -exec grep -q 'PATTERN'評価されtrue、ファイル名がprint編集されます。


2
その1つは、標準的でポータブルであるという利点があります。
ステファンシャゼル

grep -Lただし、GNUには違いがありますが、リストに読み取り不可能なファイルも含まれます。
ステファンシャゼル


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.