I want to print out the name of a file if and only if it does not contain the string foo. However, if file contains foo and I run this
grep -lv 'foo' file
file is outputted. Why does this happen and what can I do to work around it?
Advertisement
Answer
-v means to match any line that doesn’t match the pattern. So -lv means to list any file that contains any line that doesn’t match the pattern. That’s not the same as a file where none of the lines match the pattern.
Use the -L option to list all files that don’t have any match for the pattern.
grep -L 'foo' file
-L, --files-without-match
Suppress normal output; instead print the name of each input file from which no output would normally have been printed. The scanning will stop on the first match.
Don’t use -v with this. -L already inverts which files are listed, and -v inverts the way lines are matched, so -Lv is the same as -l.