Как использовать Unix для переименования всех HTML-файлов по их заголовкам?

Как использовать Unix для переименования всех HTML-файлов по их заголовкам?

То есть переименовать все HTML-файлы в каталоге, используя текст, содержащийся в TEXT?

Может ли сработать комбинация grep, sed и mv?

Например, у меня есть файл, содержащий 1.html. Заголовок 1.html содержится в HTML-файле как TEXT (он содержится внутри тегов заголовка TEXT. Я хотел бы переименовать 1.html в TEXT.html

Если файл называется 5.html, а заголовок 5.html — TEST2, то я хочу переименовать 5.html в TEST2.html.

решение1

for file in *.html ; do 
    name="$(sed -n '/<title>/{s=[^>]*title>==;s=</title.*==;s=[^0-9A-Za-z-_]=_=g;p;q}' "$file")"
    if [ -f "$name" ]; then
       [ -f "${name}_$file" ] || mv -f "$file" "${name}_$file"
    else
       mv -v "$file" "${name}.html"
    fi
done

sedобъяснение:

    /<title>/ -- finds the string with <title> and 
                 applies a group of commands to it
    {}        -- a group of commands
    s=[^>]*title>== -- removes everything before <title> including tag
    s=</title.*==   -- removes everything after </title> including tag
    s=[^0-9A-Za-z-_]=_=g -- substitute all non alphabet/num characters to _  
    p -- print the output
    q -- exit as there is no need to process rest of the file

ps. echoперед каждым mvзапуском в сухом режиме убедитесь, что все в порядке.

pps. также конструкция sed ожидает, что fdjskjfls находится на одной строке и не имеет никаких тегов на той же строке.

решение2

Я бы использовал более простой подход, предполагая, что у вас есть GNU grep:

for f in *.html ; do 
    mv -v "$f" "$(grep -oP '<title>\K.+?</title>' $f | sed 's#</title>##').html"
done

Связанный контент