テキスト文字列を含まないすべてのファイルを見つけるために、どの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
でそれを使用する方法を知りたいです:)
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の場合は、必要なファイルなので、最初の列(ファイル名)を出力から切り取ります。
-v -l
(一致しない行があるファイル)を-L
(一致する行がないファイル)に変更すると、検索は機能しますが、grep
の再帰的(-r
)オプション:
grep -rL shared.php .
そんなこと知ってる
grep -L *
はこれを行いますが、find
コマンドをgrep
と組み合わせて使用してファイルを除外するにはどうすればよいですか。
find
とgrep
は次のように使用できます。
find . -type f ! -exec grep -q 'PATTERN' {} \; -print
ここに -print
は、前の式:! -exec ... {}
はtrue
として評価されます。
そのため、見つかったファイルごとに、grep -q 'PATTERN'
はexec
utedであり、結果がfalse
の場合、式全体! -exec grep -q 'PATTERN'
はtrue
と評価され、ファイル名はprint
edです。
オプション-Lで一致しない結果が見つかりました
grep -iL shared.php .