如何使用bash脚本将文件名中任意多个连续下划线替换为单个下划线
Bash 将文件名中任意连续下划线替换为单个下划线的实现方案
你当前的双下划线替换逻辑仅能匹配连续两个下划线,只需做极小改动即可支持匹配任意长度的连续下划线:
最简方案(使用Bash原生扩展通配符)
- 先开启Bash的
extglob(扩展通配符)特性 - 将参数替换的匹配规则改为
+(_),即可匹配1个及以上连续的下划线字符
完整代码如下:
# 开启扩展通配符,仅需执行一次 shopt -s extglob for file in *; do # 把任意长度的连续下划线替换为单个 f=${file//+(_)/_} echo "$f" # 如果需要实际重命名文件,取消注释下一行即可 # mv -- "$file" "$f" done # 可选:执行完成后关闭扩展通配符恢复默认配置 # shopt -u extglob
无需修改Shell配置的替代方案(调用sed)
如果不想开启extglob,也可以通过sed实现正则替换,兼容性更强:
for file in *; do f=$(sed 's/_\+/_/g' <<< "$file") echo "$f" done
注意:操作涉及文件重命名时,建议先执行
echo输出替换结果确认无误后,再添加mv命令执行实际重命名,避免误操作。
内容的提问来源于stack exchange,提问作者Oortone
相关产品推荐
相关产品推荐

