To find all the files that contain "foo" in current folder, I use:
grep -r "foo" . To find all the files that contain "bar" in current folder, I use:
grep -r "bar" . But how to find all files that does not contain 'foo' and 'bar'?
To print lines that do not contain some string, you use the -v flag:
grep -r -v "bar" . | grep -v "foo" This gives you all lines that do not contain foo or bar.
To print files that do not contain some string, you use the -L flag. To non-match several strings, you can use regular expressions with the -P flag (there are several regex flags you can use):
grep -r -L -P "(foo|bar)" . This prints a list of files that don't contain foo or bar.
Thanks to Anton Kovalenko for pointing this out.
-v is about non-matching lines being present, not about matching lines being absent.-r in the pipe. For the "non-matching lines", that's what the OP is asking for: grep -v "foo" goves lines that do not match foo.Recursively searches directories for all files that do no contains XYZ
find . -type f | xargs grep -L "XYZ" With awk, something like:
awk 'BEGIN {f=ARGV[1] ; ff=0} f != FILENAME { if ( ff>0 ) { print f } ; ff=0 ; f=FILENAME } /SEARCHSTRING/ {ff=1} END {if ( ff>0 ) { print f } }' INPUT_FILE_LIST(PATTERN) Basically it reads every input file and if sees your SEARCHSTRING (which can be a regex), it saves that info. After finishing the current file (or after the last file), check if it found something, and if so, print the previous filename.
*.py **/*.py files not containing an import.