
時々 the の代わりにgrep
's-v
とスイッチを一緒に使用することを提案する答え(または説明)があります(特に後者が使用できない場合)。著者は、彼らが同等だと信じているようだ。-l
-L
では、お互いを変えて使えますか? IOW、grep -v -l
と同じ結果が出ますかgrep -L
?
答え1
いいえ、同じではないので、結果は次のようになります。ほぼいつも1は異なります。
各スイッチの機能を見てみましょう。
‘-L’
‘--files-without-match’
Suppress normal output; instead print the name of each input file
from which no output would normally have been printed.
これは簡単なはずです。
grep -L 'pattern' ./*
一致する行を含まないすべてのファイルの名前を印刷します'pattern'
。
‘-v’
‘--invert-match’
Invert the sense of matching, to select non-matching lines.
これも非常に簡単です。
grep -v 'pattern' ./*
各ファイルに一致しないすべての行を印刷します。'pattern'
‘-l’
‘--files-with-matches’
Suppress normal output; instead print the name of each input file
from which output would normally have been printed.
繰り返しますが、簡単です。
grep -l 'pattern' ./*
一致する行が1つ以上含まれるすべてのファイルの名前を印刷します'pattern'
。
今和を合わせると-v
どうなりますか-l
?grep -l
一致しない行を選択して、
grep -vl 'pattern' ./*
一致しない行が1つ以上含まれているすべてのファイルの名前を印刷することを除いて、それと大差ありません'pattern'
。
したがって、違いに注意してください。
grep -L
ファイル名の印刷一致する行がない場合にのみ 'pattern'
grep -vl
ファイル名の印刷1 つ以上の行が一致しない場合のみ 'pattern'
1:
上記に基づいて、これら2つのコマンドがいつ同じ出力を生成できるかを簡単に知ることができます。
- ファイルが空ではないみんな行がパターンと一致する場合(この場合は出力なし
)、またはファイルが空ではないいいえ行がパターンと一致する - この場合に一覧表示されます。
物語の教訓:grep -vl
模倣のために使用しないでくださいgrep -L
。サポートしていない
場合grep
-L
これがシミュレートする正しい方法です。。
答え2
追加の注意事項として、このオプション(GNU拡張)をサポートしていないgrep
システムでは、@don_crisstiによって示された方法を使用することは役に立ちません。シェルループを使用する必要があります。等しい-L
-vl
grep -L pattern ./*
する:
for file in ./*; do
{
grep -q pattern || printf '%s\n' "$file"
} < "$file"
done
ファイルを開けないようにしたい場合は、ファイル名を印刷するのではなく、リダイレクトが{...}
完全に行われていることを確認できます。grep
同等の項目grep -ZL pattern ./*
(この出力を確実に後処理するために必要です)の場合は、上記の項目%s\n
を置き換えてください%s\0
。
GNUに該当する場合は、grep -rL pattern .
次のことができます。
find . -type f ! -exec grep -q pattern {} \; -print
読み取れないファイルの名前も印刷します(-readable
find
述語を使用できますが、GNU拡張子でもあるため、grep
サポートしていない場合はサポートしない-L
可能性があります)。find
-readable
そしてzsh
:
for f (./**/*(DN.)) {{grep -q pattern || print -r $f}<$f}