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

echo추신: 각각의 작업을 수행하기 전에 건조 모드 로 실행 mv하고 모든 것이 잘 보이는지 확인하십시오.

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

관련 정보