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

如何使用Shell脚本批量重命名Linux目录下的*.gz文件为有序序列

重命名.csv.gz文件为有序序列格式的实现方案

报错原因

你之前执行的命令有两个问题:

  1. find的-exec参数必须以\;或者+作为结束标识,缺少就会报missing argument to -exec错误
  2. -exec本身不支持自动生成递增序号的占位符,直接写%03d不会被解析为计数变量

实现方案

方案1:mv配合bash循环(所有Linux发行版通用,兼容性最好)

进入你存放所有.gz文件的目录后执行以下命令:

# 预定义日期后缀,避免执行过程中跨零点导致日期不一致
DATE_SUFFIX=$(date '+%Y%m%d')
# 初始化序号计数器
COUNT=1
# 遍历当前目录下所有.csv.gz文件
for file in *.csv.gz; do
  # 跳过非文件类型的匹配项,避免无匹配文件时报错
  [ -f "$file" ] || continue
  # 生成3位补零的序号
  SEQ=$(printf "%03d" $COUNT)
  # 执行重命名,--用于兼容以-开头的文件名
  mv -- "$file" "FILE${SEQ}_${DATE_SUFFIX}.csv.gz"
  COUNT=$((COUNT+1))
done

执行前可以先把mv替换为echo mv,确认打印的重命名结果符合预期后再改回mv执行实际操作。

方案2:perl版rename实现(Debian/Ubuntu系发行版默认适用)

如果你的系统带perl版本的rename(执行rename -V返回包含perl的信息即可用),可以用更简洁的写法:

DATE_SUFFIX=$(date '+%Y%m%d')
# 加-n参数为试运行,仅打印修改结果不实际执行,确认无误后去掉-n即可生效
rename -n 'our $i; sprintf("FILE%03d_'${DATE_SUFFIX}'.csv.gz", ++$i)' *.csv.gz

注意事项

  • 默认按文件名的字典序排序重命名,如果需要按修改时间、文件大小等其他规则排序,可调整循环中遍历文件的逻辑,比如按修改时间从旧到新排序就把for file in *.csv.gz替换为for file in $(ls -tr *.csv.gz)
  • 如果需要处理子目录下的.csv.gz文件,可配合find输出结果到循环即可。

内容的提问来源于stack exchange,提问作者CMR H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:06:03