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
sed
Erlä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 echo
vor jedem mv
Lauf 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