Linux跨多目录复制同名文件如何保留原扩展名实现编号备份
问题背景
多个不同目录下存放有名为1.jpg的图像文件,需要统一复制到新的目标目录。涉及共100个按数字命名的源文件夹,要求按1、2、3…100的数字顺序遍历,避免字典序下1、10、11…2、20…的乱序问题。
最初使用的命令如下:
find folder/{1..100} -type f -name '1.*' -exec cp --backup=numbered "{}" folder/new/ \;
执行后备份文件命名为1.jpg.~1~、1.jpg.~2~格式,扩展名被改动,不符合预期。期望的命名格式为以下两种:
- 格式1:
1.~1~.jpg、1.~2~.jpg、1.~3~.jpg… - 格式2:
1(1).jpg、1(2).jpg、1(3).jpg…
解决方案
cp自带的--backup=numbered参数默认将版本序号追加到完整文件名末尾,无法自动保留扩展名位置,直接通过shell循环维护计数器、手动拼接目标文件名即可实现需求,同时保留数字顺序遍历的逻辑。
方案1:生成1(序号).jpg格式(和Windows重名复制规则一致)
# 预先创建目标目录 mkdir -p folder/new counter=1 # 严格按1-100数字顺序遍历源文件夹,无字典序乱序问题 for dir in folder/{1..100}; do src_file="$dir/1.jpg" # 仅当源文件存在时执行复制 if [ -f "$src_file" ]; then target_file="folder/new/1.jpg" # 目标文件重名时递增序号,直到找到不冲突的文件名 while [ -f "$target_file" ]; do target_file="folder/new/1($counter).jpg" counter=$((counter + 1)) done cp "$src_file" "$target_file" fi done
方案2:生成1.~序号~.jpg格式(保留原cp备份的序号风格)
mkdir -p folder/new counter=1 find folder/{1..100} -type f -name '1.jpg' | while read -r src_file; do target_file="folder/new/1.jpg" while [ -f "$target_file" ]; do target_file="folder/new/1.~${counter}~.jpg" counter=$((counter + 1)) done cp "$src_file" "$target_file" done
优化提示
- 原命令中
-name '1.*'匹配规则过宽,会误抓同路径下1.png、1.txt等非目标文件,建议改成-name '1.jpg'精准匹配 - 正式执行前可将命令中的
cp替换为echo cp,打印所有待执行的复制操作,确认路径、命名规则无误后再实际运行,避免误覆盖文件
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

