Использование xargs в ответах выше не обязательно;вы можете добиться того же, что и в этом случае:
find . -type f -exec grep -q <string-to-match> {} \; -not -exec grep -q <string-not-to-match> {} \; -print
grep -q
означает «бежать спокойно», но возвращает код выхода, указывающий, было ли найдено совпадение;find
может затем использовать этот код завершения, чтобы определить, следует ли продолжать выполнение остальных его параметров.Если -exec grep -q <string-to-match> {} \;
вернет 0, то он продолжит выполнение -not -exec grep -q <string-not-to-match>{} \;
.Если он также возвращает 0, он будет продолжать выполнять -print
, который печатает имя файла.
Как уже отмечалось в другом ответе, использование find
таким образом имеет большие преимущества перед grep -Rl
где вы хотите искать только файлы определенного типа.Если, с другой стороны, вы действительно хотите искать все файлы, grep -Rl
, вероятно, быстрее, так как он использует один процесс grep
для выполнения первого фильтра для всех файлов вместо отдельного процесса grep
для каждого файла.