Добавить расширение ко всем файлам в каталоге, содержащем точную строку

У меня есть большой каталог с несколькими уровнями и тоннами файлов. Большинство (но не все) этих файлов являются файлами HTML, но не имеют расширения .html (проблема при копировании в Windows).

Все файлы HTML имеют это как первую строку:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

Как я могу, просто используя команду, добавить расширение .html ко всем файлам, содержащим эту строку?

Я видел этот вопрос SO , но он не переименовывается в зависимости от того, содержит ли строка строку.

2 Solutions collect form web for “Добавить расширение ко всем файлам в каталоге, содержащем точную строку”

Предполагая, что все файлы без расширения .html вообще не имеют расширения, вот простой сценарий bash для выполнения того, что вам нужно.

 find . -type f ! -iname "*.html" -a ! -iname "*.htm" | while IFS= read -r file; do head -1 "${file}" | if grep -q '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' ; then mv "${file}" "${file}.html" fi done 

Этот скрипт делает следующее, чтобы:

  1. Рекурсивно находит все файлы в вашем текущем каталоге и дочерних каталогах, у которых нет расширения .html .
  2. Проверяет, является ли найденная первая строка файлов указанной вами строкой.
  3. Если первая строка соответствует, файл переименовывается, чтобы включить расширение .html .
 goldn='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' \ find . -type f \ ! -name '*.[hH][tT][mM]' \ ! -name '.*.[hH][tT][mM]' \ ! -name '*.[hH][tT][mM][lL]' \ ! -name '.*.[hH][tT][mM][lL]' \ -exec sh -c ' shift "$1" while case $# in 0 ) break;; esac do read l1 < $1 case $l1 in "$goldn" ) mv "$1" "$1.html";; esac shift done ' 2 1 {} + 
  • Как мне разрешить права доступа к каталогам и посмотреть, не хватает ли прав на запись?
  • поиск каталогов, содержащих один файл, и отсутствие другого
  • Объединение пар файлов в цикле
  • Как синхронизировать каталоги на двух разных внешних жестких дисках?
  • Как перемещаться по селекторам файлов и каталогов диалогового окна?
  • Перемещение файлов из подпапок в родительскую папку в более крупном каталоге
  • Как я могу подсчитать количество разных символов в файле?
  • Bash - получить строку, содержащую пробелы в цикле
  • Поиск большого количества расширений с помощью find
  • Как получить доступ к содержимому файла, который используется в качестве аргумента при запуске сценария bash?
  • Поиск файла по части его содержимого
  • Linux и Unix - лучшая ОС в мире.