정확한 문자열을 포함하는 디렉터리의 모든 파일에 확장자를 추가합니다.

정확한 문자열을 포함하는 디렉터리의 모든 파일에 확장자를 추가합니다.

여러 수준과 많은 파일이 포함된 큰 디렉터리가 있습니다. 이러한 파일의 전부는 아니지만 대부분은 HTML 파일이지만 .html확장자가 없습니다(Windows에 복사할 때 문제를 일으킴).

모든 HTML 파일에는 다음과 같은 내용이 있습니다.첫 번째철사:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

.html명령만 사용하여 해당 문자열을 포함하는 모든 파일에 확장자를 어떻게 추가할 수 있습니까 ?

나는 이것을 본 적이 있다그래서 질문은이지만 문자열 포함 여부에 따라 이름이 바뀌지는 않습니다.

답변1

확장자가 아닌 모든 .html파일에 확장자가 전혀 없다고 가정하면 필요한 작업을 수행하는 간단한 bash 스크립트가 있습니다.

find . -type f ! -iname "*.html" -a ! -iname "*.htm" | while IFS= read -r file; do
    head -1 "${file}" | if grep -q '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' ; then 
        mv "${file}" "${file}.html" 
    fi
done

스크립트는 다음 작업을 순서대로 수행합니다.

  1. .html현재 디렉터리와 하위 디렉터리에서 확장자가 없는 모든 파일을 반복적으로 찾습니다 .
  2. 찾은 파일의 첫 번째 줄이 사용자가 제공한 문자열인지 확인합니다.
  3. 첫 번째 줄이 일치하면 .html확장자를 포함하도록 파일 이름이 변경됩니다.

답변2

goldn='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' \
find . -type f \
   ! -name  '*.[hH][tT][mM]'     \
   ! -name '.*.[hH][tT][mM]'     \
   ! -name  '*.[hH][tT][mM][lL]' \
   ! -name '.*.[hH][tT][mM][lL]' \
-exec sh -c '
   shift "$1"
   while case $# in 0 ) break;; esac
   do
      read l1 < $1
      case $l1 in "$goldn" ) mv "$1" "$1.html";; esac
      shift
   done
' 2 1 {} +

관련 정보