¿Cómo puedo usar Unix para cambiar el nombre de todos los archivos html por sus títulos?

¿Cómo puedo usar Unix para cambiar el nombre de todos los archivos html por sus títulos?

¿Cómo cambiar el nombre de todos los archivos HTML en un directorio por el texto contenido en TEXTO?

¿Podría funcionar una combinación de grep, sed y mv?

Por ejemplo, tengo un archivo que contiene 1.html. El título de 1.html está contenido en el archivo HTML como TEXTO (está contenido dentro de las etiquetas de título TEXTO. Me gustaría cambiar el nombre de 1.html a TEXT.html

Si un archivo se llama 5.html y el título de 5.html es TEST2, entonces quiero cambiar el nombre de 5.html a TEST2.html.

Respuesta1

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

sedexplicación:

    /<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

PD. colóquelo echoantes de cada uno mvpara que se ejecute en modo seco y verifique que todo se vea bien.

PP. También la construcción sed espera que fdjskjfls esté en una línea y no tenga ninguna etiqueta antes en la misma línea.

Respuesta2

Yo usaría un enfoque más simple, asumiendo que tienes GNU grep:

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

información relacionada