为目录中包含确切字符串的所有文件添加扩展名

为目录中包含确切字符串的所有文件添加扩展名

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

相关内容