Какую краткую команду я могу использовать, чтобы найти все файлы, которые НЕ содержат текстовую строку?
Я попытался это (используя -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 *
будет делать, но как я могу использовать команду find в сочетании с grep для исключенных файлов, это то, что я действительно хочу знать.
pss: Также я не уверен, как заставить grep включать подкаталоги с grep -L *
синтаксисом, но я все еще хочу знать, как использовать его с find
:)
Ответы:
ИЛИ
Здесь мы вычисляем количество совпадающих строк (используя
-c
) в файле, если число равно 0, то это требуемый файл, поэтому мы вырезаем первый столбец, т.е. имя файла, из выходных данных.источник
grep
было зафиксировано в этом не будет по- прежнему считать , никаких имен файлов , содержащих:
или новой строки символов ...Ваш поиск должен сработать, если вы измените
-v -l
(файлы, строки которых не совпадают) на-L
(файлы без соответствия строк), но вы также можете использовать опциюgrep
'recursive (-r
):источник
find . -exec grep -v -l shared.php {} \;
(и все другие варианты, которые я пробовал) не работает для меня. Я на OS X, но я не думаю, что это должно иметь значение. Я дал тебе +1, потому что я забыл об этой-r
опции.-L
Вы можете использовать
find
иgrep
нравится это:Здесь
-print
выполняется только если предыдущее выражение:! -exec ... {}
оценивается какtrue
.Таким образом, для каждого найденного файла
grep -q 'PATTERN'
используетсяexec
, если результатом являетсяfalse
то, что все выражение! -exec grep -q 'PATTERN'
оценивается какtrue
и имя файлаprint
ed.источник
grep -L
хотя в том, что он также будет включать в список нечитаемые файлы.Вы найдете не соответствующий результат по опции -L
источник
Я думаю, что вы ищете команду, как
Опция
-q
заставляетgrep
выйти и после использования-execdir
вам нужно-print
распечатать найденные файлы.источник