Esta seria uma abordagem muito simplista supondo que seu documento é um pouco bem formado:
#!/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
Algumas explicações sobre o que acontece:
- Para obter apenas o título real, usaremos as expressões regulares
grepe Perl. Há look-aheads e look-behinds para filtrar as tags HTML atuais e obter apenas o título. É uma regex de aparência complicada, mas você não pode produzir facilmente apenas as capturas comgrep. - Certifique-se de sempre citar suas variáveis (
"$f")para que tudo funcione se os arquivos tiverem espaço em branco em seus nomes. - Por padrão,
mvsobrescreverá os arquivos existentes. Usemv -ipara evitar isso e mande seu shell avisá-lo antes de sobrescrever. - Qualquer caractere, exceto letras, números,
.,_e-, além de um espaço, será removido do nome do arquivo. Fazemos isso com a substituição de substring . - Para remover todo o espaço em branco, use
mv -i "$f" "${title//[^a-zA-Z0-9\._\-]}".html - Para manter o título real da página como está, basta usar
mv "$f" "$title".html.