¿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
sed
explicació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 echo
antes de cada uno mv
para 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