Renomeie um arquivo HTML com base no conteúdo de uma tag

0

Eu tenho muitos arquivos html que eu quero renomear de acordo com o conteúdo de a tag h1.

Alguma sugestão sobre como fazer isso no bash?

Exemplo de um arquivo:

<!DOCTYPE html><html lang="pt-BR"><head><meta charset="utf-8"><title>Repositório - MAIS</title>
 <script src="lib/tudo.js"></script>
 <link rel="stylesheet" href="lib/style.css">
</head>
<body>
<div id="cabecalho"></div>
<div id="corpo">
<h1>teste</h1>

<div class="Experimento"></div>
<div class="gallery">
<img class="image-gallery" src="img/2dados.png">
</div>

<br><br><strong>Mídia:</strong> experimento (uma aula dupla)

<br><br><strong>Descrição:</strong> este experimento propõe 4 jogos diferentes, todos baseados no lançamento de 2 dados comuns. Discutindo as chances de cada jogador vencer cada um dos jogos, os estudantes terão a chance de discutir vários conteúdos relacionados à probabilidade

<br><br><strong>Conteúdo:</strong> experimento aleatório, espaço amostral, eventos equiprováveis, probabilidade

<br><br><strong>Recomendação de uso:</strong> este experimento pode ser usado como introdução ou aplicação dos conceitos iniciais de probabilidade.

<br><br><strong>Autoria:</strong> este experimento foi desenvolvido pela <a class="externo" href="http://www.mais.mat.br" target="_blank">Mais</a> e pode ser utuilziado e distribído livremente, contanto que citada a autoria original.

<a class="download" href="http://www.mais.mat.br/recursos/images/5/5b/2dados.pdf">Baixar</a>

</div>
<div id="rodape"></div>
</body>
</html>

Eu quero que o arquivo seja renomeado para "teste.html"

Se for útil, esta tag estará sempre na 8ª linha de cada arquivo e sozinha (nada mais na mesma linha). Além disso, há sempre apenas uma ocorrência de h1 em cada arquivo.

    
por Leo 17.02.2018 / 18:19

5 respostas

3

Com :

Arquivo:

<!DOCTYPE html>
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <a>foo</a>
        <b>bar</b>
        <c>base</c>
    </body>
</html>

Comando:

for file in *.html; do
    tag=$(xmllint --xpath '//b/text()' $file)
    echo mv "$file" "${tag}_$file"
done

Comentário:

Coloque o comando echo quando seus testes ficarem bem para executar o comando para real

    
por 17.02.2018 / 18:35
1

O caminho certo com as ferramentas find + xmlstarlet :

find . -type f -name "*.html" -exec sh -c \
'name=$(xmlstarlet sel -t -v "//tagname" $1 2>/dev/null); 
 [ ! -z "$name" ] && echo mv "$1" "${1%%/*}/${name}.html"' _ {} \;
  • name - variável que é designada com um valor (o conteúdo da tag tagname ) para o novo nome de arquivo
  • [ ! -z "$name" ] - verifique se um novo nome de arquivo não está vazio (ou seja, <tagname> foi encontrado e tinha um valor)
por 17.02.2018 / 18:46
1

Com xmlstarlet:

xmlstarlet format --html teste.html | xmlstarlet select --html --template --value-of '//html/body/div/h1'

Saída:

teste

Eu usei xmlstarlet format --html teste.html para corrigir seu código html não válido.

    
por 17.02.2018 / 18:57
0

Se a tag estiver sozinha na 8ª linha, você tem muitas maneiras de escolhê-la.

tag=$( awk NR==8 file )

tag=$( awk 'NR == 8 { print ;}' file )

onde

  • NR é o número de registros (número da linha)
  • print é ação implícita

ou

tag=$(sed -n 8p file)

onde

  • -n não ecoará linha
  • 8p print linha 8.

e muitos outros.

como notado no comentário, retransmitir no número da linha é arriscado. Se o arquivo for um arquivo xml válido, a extração da tag seria mais fácil e segura.

    
por 17.02.2018 / 18:30
0

Minha solução final foi o código abaixo, combinando duas sugestões. Obrigado pessoal!

for file in *.html; do
    tag=$(xmlstarlet format --html $file | xmlstarlet select --html --template --value-of '//html/body/div/h1')
    mv "$file" "${tag}.html"
done

Funcionou muito bem para meus arquivos!

    
por 19.02.2018 / 11:37