Como posso usar o Unix para renomear todos os arquivos html por seus títulos?

0

Como em, renomeie todos os arquivos HTML em um diretório pelo texto contido em TEXTO?

Poderia funcionar uma combinação de grep, sed e mv?

Por exemplo, eu tenho um arquivo contendo 1.html. O título de 1.html está contido no arquivo HTML como TEXT (está contido nas tags de título TEXT. Gostaria de renomear 1.html para TEXT.html

Se um arquivo é nomeado como 5.html, e o título de 5.html é TEST2, então eu quero renomear 5.html para TEST2.html.

    
por InquilineKea 07.05.2014 / 11:09

2 respostas

7
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 explanação:

    /<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

ps. coloque echo antes de cada mv rodar no modo dry e verifique se tudo está bem.

pps. também sed construção espera, que fdjskjfls está em uma linha e não tem tags antes na mesma linha.

    
por 07.05.2014 / 11:34
2

Eu usaria uma abordagem mais simples:

for f in *.html ; do 
    mv -v "$f" "$(grep -oP '<title>\K.+?</title>' $f | sed 's#</title>##').html"
done
    
por 07.05.2014 / 15:52

Tags