You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Linux下用Shell脚本修改文件名,保留指定字段至.gz扩展名

解决方案

下面提供两种可靠的Bash脚本方案来实现你的重命名需求,避免使用ls解析文件名的不安全做法:

方法一:利用Bash参数展开替换

这种方式简洁直接,适合文件名格式固定的场景:

#!/bin/bash

# 遍历所有包含.C201且以.gz结尾的文件
for file in *C201*.gz; do
    # 当glob没有匹配到任何文件时,跳过循环
    [[ -f "$file" ]] || continue

    # 替换规则:将".C201"之后到".gz"之前的所有内容替换为空
    new_file="${file/.C201.*.gz/.C201.gz}"

    # 仅当新文件名与原文件名不同时执行重命名
    if [[ "$new_file" != "$file" ]]; then
        mv -v "$file" "$new_file"
    fi
done

方法二:正则表达式匹配(更灵活)

如果文件名格式有变化的可能,正则表达式匹配会更可靠:

#!/bin/bash

for file in *C201*.gz; do
    [[ -f "$file" ]] || continue

    # 用正则捕获从开头到".C201"的完整前缀
    if [[ "$file" =~ ^(.*\.C201)\..*\.gz$ ]]; then
        new_file="${BASH_REMATCH[1]}.gz"
        mv -v "$file" "$new_file"
    fi
done

关键说明

  1. 避免用ls解析文件名:ls输出的文件名如果包含空格、换行或特殊字符,会导致后续处理出错,直接用*C201*.gz这种glob匹配文件是更安全的做法。
  2. 测试先行:可以先把脚本中的mv -v换成echo mv -v,运行脚本检查生成的新文件名是否符合预期,确认无误后再执行实际重命名。
  3. 跳过无匹配场景:[[ -f "$file" ]] || continue用来防止当没有匹配到任何文件时,循环误处理*C201*.gz这个字符串本身。

内容的提问来源于stack exchange,提问作者Suhail Siddiqui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:02:10