Список всех файлов, содержащих определенную строку.

Мне нужно рекурсивно искать все файлы, содержащие определенную строку, чтобы я мог скопировать новый файл поверх старого. Например:

Если файл имеет строку «replace me»:

  1. найти полный путь к файлам:

    /dir/of/file/filename.php /dir/of/different/file/filename.php 
  2. замените файл на новый файл filename.php .

Это звучит просто, но я потратил несколько часов на то, чтобы не получить никуда.

 find some/dir \ -exec grep -q "replace me" {} \; \ -exec cp some/new/filename.php {} \; 

Решение Игнасио с 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 {} \; 

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

 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». Вы можете сделать это и в других примерах. В случае поиска вы можете удалить весь набор операторов OR в parens и просто использовать -name '*thumb.php' . Все приведенные выше примеры будут работать только с filesthat, которые соответствуют этим шаблонам имен и содержат строку «timthumb».