Как я могу найти все файлы, которые НЕ содержат текстовую строку?

Обычно возможно прокрутить систему с Busybox; веб-сайт busybox детализирует, как сделать это.

Статически связанный busybox двоичный файл потребует просто нескольких megs памяти (по тому, чего ядро требует, конечно). Я смог загрузиться и войти в машину с 8M поршня.

Однако это относительно сложно для получения всех системных служб, можно потребовать, чтобы работа, с помощью маленького существующего распределения могла бы быть лучше.

Сколько "мало памяти"? Вы находитесь в действительно крошечной встроенной системе? Если у Вас нет меньше, чем 64M, или Ваш процесс должен использовать много доступного поршня (и никакая подкачка), я рекомендовал бы идти с минимальным стандартным дистрибутивом.


Править: "buildroot" инструмент является компаньоном Busybox, который помогает Вам создать очень маленькие применимые файловые системы.

40
04.09.2016, 00:42
5 ответов
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 затем, это - необходимый файл, таким образом, мы сокращаем первый столбец т.е. имя файла от вывода.

8
27.01.2020, 19:35
  • 1
    Это ужасно сложно. См. ответ Kevin. –  Gilles 'SO- stop being evil' 16.12.2011, 09:49
  • 2
    @Gilles да я соглашаюсь с Вами. У меня есть +1 его ответ. –  Sachin Divekar 16.12.2011, 10:40
  • 3
    Это не только "ужасно сложно", но неправильно поскольку это также перечислило бы все файлы, которые содержат несколько из 10 строк, соответствующих шаблону. Даже если это grep был зафиксирован это все еще не примет имен файлов, содержащих : или символы новой строки... –  don_crissti 02.10.2015, 14:46
  • 4
    @don_crissti, благодарит упомянуть! Однако, если Вы не используете много кода вставки копии, решением выше является rly хороший трюк. –  Ufos 13.10.2016, 19:54
  • 5
    @Ufos - Я действительно не получаю Ваш комментарий... Это неправильно. Так или иначе не стесняйтесь использовать его, если это похоже на "действительно хороший трюк" Вам... –  don_crissti 13.10.2016, 20:00

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

grep -rL shared.php .
60
27.01.2020, 19:35
  • 1
    , какая находка должна работать? –  cwd 14.12.2011, 17:13
  • 2
    @Kevin - извините, find . -exec grep -v -l shared.php {} \; (и все другие варианты, которые я попробовал) не работает на меня. Я нахожусь на OS X, но я не думаю, что это должно иметь значение. Я дал Вам +1, потому что я забыл о -r опция. –  cwd 14.12.2011, 17:49
  • 3
    @cwd я знаю это, стар, но я хочу оставить это здесь для будущих читателей: то, что Вы находитесь на OS X, действительно имеет значение. MAC OSX использует команды FreeBSD. Большинство людей здесь принимает Linux (GNU) команды стиля. У них есть различные аргументы, различные способы обработать детали. –  Rich Homolka 29.04.2016, 05:43
  • 4
    С 2016 OSX, действительно кажется, поддерживает -L –  David Moles 08.03.2017, 02:14
  • 5
    @kevin, я сказал это, делает, не, что он не делает. :) не, что любой явно сказал, это не сделало, но комментарии путали (и я, конечно, столкнулся с другим OS X / BSD по сравнению с проблемами GNU). –  David Moles 08.03.2017, 06:58

Я думаю, что Вы ищете команду как

find . -type f -execdir grep -q -v shared.php {} \; -print

Опция -q делает grep выход и после использования -execdir Вам нужно -print распечатать найденный файлами.

-1
27.01.2020, 19:35

Вы не находите не совпадающие результат по опции -L

grep -iL shared.php .
1
27.01.2020, 19:35

Я знаю, что grep -L * сделает это, но как я могу использовать команду find в сочетании с grep , чтобы Исключить файлы - это то, что я действительно хочу знать

Вы можете использовать find и grep следующим образом:

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

Здесь -print выполняется, только если предыдущее выражение: ! -exec ... {} оценивается как истина .
Итак, для каждого найденного файла grep -q 'PATTERN' используется exec , если результат false , то весь выражение ! -exec grep -q 'ШАБЛОН' оценивается как истина , а имя файла - print ed.

4
27.01.2020, 19:35

Теги

Похожие вопросы