我有一个包含多个级别和大量文件的大目录。这些文件中的大多数(但不是全部)都是 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 {} +