Shell脚本需求:为无扩展名文件添加.html后缀
解决Shell脚本给无扩展名文件添加.html后缀的问题
嘿,我明白你的困扰——现有脚本只能处理完全不含.的文件,但遇到像my.document这种带点却没有明确后缀的文件就失效了对吧?咱们先明确一下“无扩展名文件”的判断标准,再给出几种靠谱的实现方式:
首先,咱们定义要处理的目标文件:
- 完全不带点的文件(比如
readme) - 以点结尾的文件(比如
readme.) - 文件名包含点,但最后一个点后面的内容你不认为是有效扩展名(比如
my.file,你想给它加.html)
方式一:用find批量处理(最省心)
如果你想一次性处理目录下的所有符合条件的文件,find命令是最简洁的选择:
处理当前目录(不递归子目录)
# 合并两个条件:要么不带点,要么以点结尾 find . -maxdepth 1 -type f \( ! -name "*.*" -o -name "*." \) -exec mv {} {}.html \;
递归处理所有子目录
去掉-maxdepth 1即可:
find . -type f \( ! -name "*.*" -o -name "*." \) -exec mv {} {}.html \;
方式二:Shell循环逐个处理(更灵活)
如果需要更精细的控制(比如跳过特定文件、打印操作日志),可以写个循环脚本:
#!/bin/bash # 遍历当前目录下的所有条目 for file in *; do # 跳过目录,只处理文件 [ -f "$file" ] || continue # 核心判断:要么文件名不带点,要么以点结尾,要么没有以「.xxx」结尾的结构 if [[ ! "$file" =~ \.[^.]+$ ]] || [[ "$file" == *. ]]; then # -v 参数会输出重命名的详细信息,方便你核对 mv -v "$file" "$file.html" fi done
关键逻辑解释
[[ ! "$file" =~ \.[^.]+$ ]]:用正则表达式判断文件名没有以「.xxx」(点+至少一个非点字符)结尾,完美覆盖像my.document这种带点但无有效后缀的情况[[ "$file" == *. ]]:单独处理以点结尾的文件(比如readme.)[ -f "$file" ]:确保只处理文件,跳过目录
自定义排除有效扩展名
如果你想跳过那些已经有明确后缀的文件(比如.txt、.jpg),可以调整脚本,添加排除列表:
#!/bin/bash # 定义不需要处理的有效扩展名,用|分隔,可自行添加 exclude_extensions="\.txt|\.jpg|\.png|\.pdf" for file in *; do [ -f "$file" ] || continue # 判断逻辑:要么不在排除列表里,要么不带点,要么以点结尾 if [[ ! "$file" =~ \.($exclude_extensions)$ ]] || [[ ! "$file" =~ \. ]] || [[ "$file" == *. ]]; then mv -v "$file" "$file.html" fi done
这样,像note.txt这种有有效后缀的文件会被跳过,而my.file.v2这种会被重命名为my.file.v2.html。
内容的提问来源于stack exchange,提问作者Otorrinolaringologista -man
相关产品推荐
相关产品推荐

