Unix を使用してすべての HTML ファイルの名前をタイトルで変更するにはどうすればよいですか?

Unix を使用してすべての HTML ファイルの名前をタイトルで変更するにはどうすればよいですか?

つまり、ディレクトリ内のすべての HTML ファイルの名前を、TEXT に含まれるテキストで変更しますか?

grep、sed、mv の組み合わせは機能しますか?

たとえば、1.html というファイルがあります。1.html のタイトルは HTML ファイル内に TEXT として含まれています (タイトル タグ TEXT 内に含まれています)。1.html の名前を TEXT.html に変更したいとします。

ファイル名が 5.html で、5.html のタイトルが TEST2 の場合、5.html の名前を TEST2.html に変更します。

答え1

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説明:

    /<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.echo毎回mvドライ モードで実行して、すべてが正常に見えることを確認する前に配置します。

追記。また、sed 構文では、fdjskjfls が 1 行にあり、同じ行の前にタグがないことが想定されています。

答え2

GNU をお持ちであれば、もっと簡単な方法を使いますgrep:

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

関連情報