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
grep
e 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,
mv
sobrescreverá os arquivos existentes. Usemv -i
para 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
.