web-dev-qa-db-ja.com

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

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

私はこれを試しました(-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 *がこれを実行することはわかっていますが、除外したファイルに対してgrepと組み合わせてfindコマンドを使用するにはどうすればよいかを知りたいです。

pss:また、grep -L *構文でgrepインクルードサブディレクトリを作成する方法もわかりませんが、findでそれを使用する方法を知りたいです:)

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

OR

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

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

9
Sachin Divekar

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

grep -rL shared.php .
61
Kevin

そんなこと知ってる grep -L *はこれを行いますが、findコマンドをgrepと組み合わせて使用​​してファイルを除外するにはどうすればよいですか。

findgrepは次のように使用できます。

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

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

4
don_crissti

オプション-Lで一致しない結果が見つかりました

grep -iL shared.php .
1
prakash