Переименовать все пробелы в именах файлов изображений внутри html php-файлов

Внутри разных htm.gz, html.gz и php.gz веб-файлов у меня есть изображения, а в формате .jpg есть имя с пробелом вместо «-», но в каталоге / images /, где находятся все изображения, у них есть »- "вместо пространства

В html-файле у меня есть « <img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt="">

И в каталоге «/ images /» все перечислены в порядке с «-» между такими словами, как «red-roses-in-summer-54.jpg»,

Итак, я хочу, чтобы команда bash / скрипт выполняла поиск во всех файлах htm.gz, html.gz и php.gz внутри /var/www/domain.com и находила все .jpg изображения и заменяла место «-». Так из / images / red roses летом 54.jpg, чтобы иметь /images/red-roses-in-summer-54.jpg

Сервер работает на centos 7, если это важно.

2 Solutions collect form web for “Переименовать все пробелы в именах файлов изображений внутри html php-файлов”

В идеале это должно быть сделано на языке, таком как perl или python которые имеют хорошие библиотеки разбора HTML. Но если вы хотите сделать это в сценарии оболочки, вы можете установить пакет xml2 , который предоставляет инструменты html2 и 2html для преобразования HTML в формат плоского файла, подходящий для использования с линейными инструментами, такими как sed , grep , awk и т. д.

Он также содержит аналогичные инструменты для работы с XML и CSV-файлами.

Затем вы можете использовать sed для преобразования пробелов при сопоставлении строк img src с тире. Затем конвертируйте обратно в html.

Например, используя вашу примерную строку html:

 $ cat file.html <img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt=""> $ html2 < file.html | sed -e '\:/img/@src=/images/: s/ /-/g' | 2html <html><body><img class="photo" width="400" height="600" src="/images/red-roses-in-summer-54.jpg" alt=""> 

Переназначьте вывод из этого file.new.html , например, file.new.html . а затем mv -f file.new.html file.html если вы хотите заменить исходный файл на модифицированную версию. Я настоятельно рекомендую хранить резервную копию исходных файлов, чтобы вы могли вернуться к хорошо известной отправной точке, если вы допустили ошибку.

BTW, формат плоского файла, созданный html2 выглядит так:

 $ html2 < file.html /html/body/img/@class=photo /html/body/img/@width=400 /html/body/img/@height=600 /html/body/img/@src=/images/red roses in summer 54.jpg /html/body/img/@alt 

xml2 упакован для Debian и Ubuntu и, возможно, для других дистрибутивов Linux. Если он не доступен для вашего unix, вы можете найти исходный код по ссылке выше.

Есть много способов внести эти изменения во множество файлов. Вот простой пример цикла.

 for htmlfile in *.html ; do html2 < "$htmlfile" | sed -e '\:/img/@src=/images/: s/ /-/g' | 2html > "$htmlfile.new" \ && mv -f "$htmlfile.new" "$htmlfile" done 

ПРЕДУПРЕЖДЕНИЕ: проверьте, что это делает то, что вы ожидаете, прежде чем запускать его на большом количестве файлов HTML. И сохраните резервную копию оригиналов. Если HTML в ваших файлах не является полностью допустимым HTML (т. html2 | ... | 2html Если он не пройдет проверку синтаксиса HTML), тогда html2 | ... | 2html html2 | ... | 2html html2 | ... | 2html может сделать ваши html-файлы еще более сломанными, чем они есть.

Если файлов слишком много или файлы находятся в нескольких подкаталогах, вам придется использовать find ... -exec . Существует множество примеров использования find здесь на этом сайте.

Я нашел что-то, но не работает хорошо:

 find /var/www/domain.com -type f ! \( -name '*.db' -o -name '*.sqlite' -o -name '*.feed' -o -name '*.com' -o -name '*.xml' -o -name '*.gz' -o -name '*.txt' -o -name '*.pdf' -o -name '*.js' -o -name '*.css' -o -name '*.ico' -o -name '*.gif' -o -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' \) -maxdepth 1 -exec sed -e '\:/img/@src=/images/: s/ /-/g' {} \; 

Это открывает все файлы, заглядывает внутрь, НО ничего не меняет. Какие-либо предложения?

  • Фильтрация или обтекание определенных разделов файла
  • sed соответствует только во второй строке
  • Как вложить глобальные совпадения с sed?
  • Многострочная обработка текста: редактирование sshd_config
  • команда sed для добавления другого текста при множественном вводе строки
  • Удалить строку с специальными символами
  • Получите первое соответствие шаблону в строке, не использующей разрез
  • Как удалить все числа, окруженные <>
  • Извлечение жетонов из строки текста
  • Поиск файлов, содержащих несколько ключевых слов в любом месте файла
  • Извлечь третью группу текста из разделителей диапазонов
  • Linux и Unix - лучшая ОС в мире.