如何修改Shell脚本实现子目录下TIF文件批量数字重命名?
递归批量重命名所有子目录中的TIFF文件
原脚本仅处理指定路径下的直接文件,无法遍历子目录,以下是两种可行的修改方案:
方案一:使用find命令递归查找(兼容性好)
num=1 echo "Enter the file path" read -r path # 递归查找所有.tif文件并按路径排序,确保编号顺序稳定 find "$path" -type f -name "*.tif" | sort | while read -r file; do # 提取文件所在的子目录 file_dir=$(dirname "$file") # 生成4位数字格式的新文件名,保留在原目录 mv -v "$file" "$file_dir/$(printf "%04d" $num).tif" num=$((num + 1)) done
关键说明:
find "$path" -type f -name "*.tif":递归定位指定路径下所有后缀为.tif的文件sort:对查找结果排序,避免因find遍历顺序不稳定导致编号混乱dirname "$file":获取文件所在的子目录,保证重命名后的文件留在原位置,不会全部移动到根路径
方案二:使用bash globstar(仅bash 4.0+支持)
如果你的bash版本在4.0及以上,可以开启递归通配符特性:
num=1 echo "Enter the file path" read -r path # 开启递归通配符** shopt -s globstar # **/*.tif 匹配当前目录及所有子目录下的.tif文件 for file in "$path"/**/*.tif; do # 跳过非文件的匹配结果(避免无匹配时的错误) [ -f "$file" ] || continue file_dir=$(dirname "$file") mv -v "$file" "$file_dir/$(printf "%04d" $num).tif" num=$((num + 1)) done # 关闭递归通配符(可选,恢复默认设置) shopt -u globstar
关键说明:
shopt -s globstar:开启后,**会匹配当前目录及所有层级的子目录[ -f "$file" ] || continue:防止当没有子目录文件时,通配符字符串被当作文件处理
注意事项:
- 若目标目录已存在同编号的文件,
mv会直接覆盖,建议提前备份文件或添加存在性判断逻辑 - 上述方案的编号为全局递增,若需要每个子目录单独从1开始编号,需调整脚本逻辑(比如按目录分组计数)
内容的提问来源于stack exchange,提问作者user1555314
相关产品推荐
相关产品推荐

