Як я можу знайти всі файли, які НЕ містять текстового рядка?


40

Яку лаконічну команду можна використовувати для пошуку всіх файлів, які НЕ містять текстового рядка?

Я спробував це (використовуючи -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:)


1
Перша команда, яку ви написали, добре працювала на моєму комп’ютері. Яку версію знахідки ви використовуєте? А оскільки ми в цьому, може, вкажіть, на якому Unix ви працюєте ..
rahmu

@rahmu, ця команда майже завжди не працює, як ви очікували. Напевно, у вас був дуже конкретний випадок. Будь ласка, дивіться unix.stackexchange.com/questions/339619/…
sgnsajgon

Відповіді:


8
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

АБО

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

Тут ми обчислюємо кількість відповідних рядків (використовуючи -c) у файлі, якщо кількість дорівнює 0, то його необхідний файл, тому ми вирізаємо перший вихідний колонку, тобто ім'я файлу з виводу.


6
Це жахливо складно. Дивіться відповідь Кевіна .
Жил 'ТАК - перестань бути злим'

@Gilles так, я з вами згоден. У мене є +1 його відповідь.
Сахін Дівекар

6
Це не тільки "жахливо складно", але неправильно, оскільки воно також перелічить усі файли, які містять кілька 10 рядків, що відповідають шаблону. Навіть якби це grepбуло виправлено, це все одно передбачає, що жодні імена файлів, що містять :або символи нового рядка ...
don_crissti

@don_crissti, дякую за згадку! Тим не менш, якщо ви не використовуєте багато коду-вставлення коду, рішення вище - це дуже приємний трюк.
Ufos

@Ufos - Я дійсно не отримую ваш коментар ... Це неправильно . У будь-якому разі,
сміливо

57

Визначення має спрацювати, якщо ви зміните -v -l(файли, у яких будь-яка лінія не збігається) на -L(файли, у яких рядки не збігаються), але ви також можете скористатися параметром grepрекурсивного ( -r):

grep -rL shared.php .

яка знахідка повинна працювати?
cwd

@Kevin - вибачте, find . -exec grep -v -l shared.php {} \;(і всі інші варіанти, які я спробував) не працює для мене. Я на OS X, але не думаю, що це має мати значення. Я дав вам +1, бо забув про -rваріант.
cwd

@cwd Я знаю, що це старе, але я хочу залишити це тут для майбутніх читачів: той факт, що ти на ОС X, має значення. Mac OSX використовує команди FreeBSD. Більшість людей припускають команди стилю Linux (GNU). У них різні аргументи, різні способи обробки деталей.
Багата Гомолка

Станом на 2016 рік, здається, OSX підтримує-L
Девід Молес

@kevin Я сказав, що це так, не те, що ні. :) не те, що хтось прямо сказав, що цього не зробив, але коментарі були заплутані (і я, безумовно, стикався з іншими проблемами OS X / BSD проти GNU).
Девід Молес

4

Я знаю, що це grep -L *буде робити, але як я можу використовувати findкоманду в поєднанні з grepвиключенням файлів - це те, що я дійсно хочу знати

Ви можете користуватися findі grepтак:

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

Тут -printвиконується лише якщо попередній вираз: ! -exec ... {}оцінює як true.
Отже, для кожного знайденого файлу grep -q 'PATTERN'використовується executed, якщо результат є, falseто весь вираз ! -exec grep -q 'PATTERN'оцінюється як, trueа ім'я файлу printредагується.


2
Цей має перевагу бути стандартним та портативним.
Стефан Шазелас

Існує відмінність від GNU, grep -Lхоча в тому, що він також буде включати в список нечитабельні файли.
Стефан Шазелас

1

Ви знайдете невідповідний результат за опцією -L

grep -iL shared.php .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.