2

У меня есть папка с кучей HTML-файлов, пронумерованных последовательно (file1.html, file2.html и т.д.).

Я хотел бы переименовать каждый файл в соответствии с тегом в каждом файле.

Поэтому, если file1.html содержит <title>Page Name</title> , я бы хотел, чтобы скрипт переименовал файл Page Name.html .

Как мне сделать это на Linux?

1 ответ1

2

Это был бы очень упрощенный подход, предполагая, что ваш документ несколько хорошо сформирован:

#!/usr/bin/env bash
for f in *.html;
do
   title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
   mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html   
done

Некоторое объяснение того, что происходит:

  • Чтобы получить только фактический заголовок, мы будем использовать регулярные выражения grep и Perl. Есть упреждающие и упреждающие сигналы, чтобы отфильтровать фактические теги HTML и получить только заголовок. Это сложное регулярное выражение, но вы не можете легко выводить только захваты с помощью grep .
  • Обязательно всегда указывайте переменные в кавычках ("$f") чтобы все работало, если в именах файлов есть пробелы.
  • По умолчанию mv перезаписывает существующие файлы. Используйте mv -i чтобы избежать этого и попросите вашу оболочку перед перезаписью.
  • Любой символ , кроме букв, . , _ и - , а также пробел будут удалены из имени файла. Мы делаем это с заменой подстроки .
  • Чтобы удалить все пробелы, используйте mv -i "$f" "${title//[^a-zA-Z0-9\._\-]}".html
  • Чтобы сохранить фактический заголовок страницы как есть, просто используйте mv "$f" "$title".html .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .