여러 수준과 많은 파일이 포함된 큰 디렉터리가 있습니다. 이러한 파일의 전부는 아니지만 대부분은 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
스크립트는 다음 작업을 순서대로 수행합니다.
.html
현재 디렉터리와 하위 디렉터리에서 확장자가 없는 모든 파일을 반복적으로 찾습니다 .- 찾은 파일의 첫 번째 줄이 사용자가 제공한 문자열인지 확인합니다.
- 첫 번째 줄이 일치하면
.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 {} +