如何使用Shell脚本批量重命名Linux目录下的*.gz文件为有序序列
重命名.csv.gz文件为有序序列格式的实现方案
报错原因
你之前执行的命令有两个问题:
find的-exec参数必须以\;或者+作为结束标识,缺少就会报missing argument to -exec错误-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
相关产品推荐
相关产品推荐

