Wie kann ich unter Unix alle HTML-Dateien anhand ihres Titels umbenennen?

Wie kann ich unter Unix alle HTML-Dateien anhand ihres Titels umbenennen?

Wie etwa: Alle HTML-Dateien in einem Verzeichnis nach dem in TEXT enthaltenen Text umbenennen?

Könnte eine Kombination aus grep, sed und mv funktionieren?

Ich habe beispielsweise eine Datei mit dem Namen 1.html. Der Titel von 1.html ist in der HTML-Datei als TEXT enthalten (er befindet sich innerhalb der Titel-Tags TEXT. Ich möchte 1.html in TEXT.html umbenennen.

Wenn eine Datei den Namen 5.html hat und der Titel von 5.html TEST2 ist, möchte ich 5.html in TEST2.html umbenennen.

Antwort1

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

sedErläuterung:

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

P.S. Führen Sie es echovor jedem mvLauf im Trockenmodus aus und überprüfen Sie, ob alles in Ordnung aussieht.

pps. außerdem erwartet die sed-Konstruktion, dass fdjskjfls in einer Zeile steht und vorher keine Tags in der gleichen Zeile hat.

Antwort2

Ich würde einen einfacheren Ansatz verwenden, vorausgesetzt, Sie haben GNU grep:

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

verwandte Informationen