Renomeando arquivos html de acordo com a tag title

2

Eu tenho uma pasta com vários arquivos html numerados sequencialmente (file1.html, file2.html, etc).

Gostaria de renomear cada arquivo de acordo com a tag em cada arquivo.

Portanto, se file1.html contiver <title>Page Name</title> , gostaria que o script renomeie o arquivo Page Name.html .

Como faço isso no linux?

    
por To Do 03.02.2013 / 19:00

1 resposta

2

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 com grep .
  • 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. Use mv -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 .
por 03.02.2013 / 19:25

Tags