如何使用 Unix 按標題重命名所有 html 檔案?

如何使用 Unix 按標題重命名所有 html 檔案?

例如,用 TEXT 中包含的文字重新命名目錄中的所有 HTML 檔案?

grep、sed 和 mv 的組合可以運作嗎?

例如,我有一個包含 1.html 的檔案。 1.html 的標題作為 TEXT 包含在 HTML 檔案中(它包含在標題標籤 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

附:在乾燥模式下運行並驗證一切看起來都正常echomv

pps。 sed 構造也期望 fdjskjfls 位於一行上,在同一行之前沒有任何標記。

答案2

我會使用更簡單的方法,假設你有 GNU grep

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

相關內容