Перечислите все файлы, содержащие определенную строку

Если Вы знаете в какой-то момент вовремя, что файл хорош, можно сделать контрольную сумму из него и использовать его для сравнения позже, чтобы удостовериться, что это все еще цело. Это полезно прежде, чем передать файлы между носителем или через сети.

Если Вы не знаете о хорошем состоянии файла, нет нет никакого универсального пути или проверяющий на повреждение. Только определенный формат файла в каждом случае определяет то, что повреждено или не поврежденные данные.

3
01.02.2014, 18:48
2 ответа
find some/dir \
    -exec grep -q "replace me" {} \; \
    -exec cp some/new/filename.php {} \;
3
27.01.2020, 21:11
  • 1
    , я не уверен, как использовать это. как я тестирую этот вывод, прежде чем я выполню CP? –  Scott Elkin 20.08.2011, 09:52
  • 2
    Поместите echo перед cp. –  Ignacio Vazquez-Abrams 20.08.2011, 09:59
  • 3
    @ScottElkin: find может быть похожим на черную магию, но в основном это - просто серия последовательных тестов или действий, которые только выполняются, если предыдущие возвращают true. Вы могли изменить второе -exec до он закрывается \; оператор, чтобы быть просто -print показать, что было подобрано предыдущими операторами. Вы могли также добавить "эхо" перед CP для распечатывания предварительного просмотра команд, которые будут выполнены. –  Caleb 20.08.2011, 10:01
  • 4
    это работает! У меня есть та же проблема, как я сказал ниже, где она находит файлы, я не хочу. я могу отфильтровать результаты в определенные php файлы и проигнорировать остальных? –  Scott Elkin 20.08.2011, 10:21
  • 5
    Можно добавить столько предикатов, сколько Вам нравится. find(1) страница справочника детализирует их всех. –  Ignacio Vazquez-Abrams 20.08.2011, 10:28

Решение Ignacio с find вероятно, лучший способ. Здесь это со всеми подробностями из включенных комментариев. Я специфически только ищу файлы (не каталоги) затем собирающий в группу трех операторов в группе с или операторов для соответствия любому из имен:

find /dir/ \
    -type f \
    \( -name timthumb.php -or -name thumb.php -or -name rt-timthumb.php \) \
    -exec grep -q "timthumb" {} \; \
    -exec cp filename.php {} \;

Однако Вы могли также сделать открытие только с шаблонами шарика оболочки также, чем-то вроде этого:

shopt -s extglob
for file in /dir/**{timthumb,thumb,rt-timthumb}.php; do
    grep -q 'timthumb' "$file" && cp filename.php "$file"
done

Вы могли также использовать grep, чтобы сделать рекурсивный поиск вместо globbing. Это было бы полезно, если бы у Вас было много файлов:

grep -l -R -Z 'timthumb' /dir/**thumb.php | while read -d $'\0' file; do
    cp filename.php "$file"
done

Во всей замене случаев "/dir /" с основным путем Вы хотите воздействовать на и "filename.php" с исходным файлом, с которым Вы собираетесь перезаписать. Кавычка по мере необходимости. Обратите внимание, что в последнем примере я использовал ярлык для соответствия всем файлам, кто соответствие имен "*thumb.php". Вы могли сделать это в других примерах также. В случае находки Вы могли отбросить полный набор ИЛИ операторы в parens и просто использовать -name '*thumb.php'. Все вышеупомянутые примеры будут только воздействовать на filesthat, соответствуют тем шаблонам имени И содержат строку 'timthumb'.

5
27.01.2020, 21:11
  • 1
    первый не работал. "/dir / **/*.php" не ошибка каталога. –  Scott Elkin 20.08.2011, 09:49
  • 2
    второй, когда я повторяю "$file", только выкладывает путь, но огромный список происшествий, где он нашел строку. Это находит не php страницы, и найдите много страниц 10 + времена, так как строка происходит многократно на странице –  Scott Elkin 20.08.2011, 09:50
  • 3
    @ScottElkin: Извините за это. Первый, вероятно, подпер, потому что у Вас на самом деле нет подкаталогов, и это ТОЛЬКО соответствовало subdirectiries. Я отредактировал его для соответствия в текущей папке или подкаталогах. Для второго необходимо использовать -l опция к grep для вывода просто соответствия имени файла. Извините я пропустил тот ввод его. –  Caleb 20.08.2011, 09:58
  • 4
    , ничего себе, caleb, который является большим. теперь это дает мне все пути к файлам (как, я спросил), но это находит другие файлы, которые я не ожидал - файлы, которые я не хочу перезаписывать с filename.php. Существует ли способ найти только файлы, которые называют filename.php? –  Scott Elkin 20.08.2011, 10:15
  • 5
    для проверки я не трачу впустую время - я хочу заменить все timthumb.php файлы, наряду с thumb.php (если 'timthumb' найден в), и rt-timthumb.php. Вся остальная часть файлов, которые это находит как файлы журнала, функциональные файлы, я хочу проигнорировать. –  Scott Elkin 20.08.2011, 10:17

Теги

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