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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:09:38