Linux下批量打包同名不同扩展名文件的高效方案:NEF与XMP配对压缩实战


阅读 8 次

场景需求分析

在摄影后期处理工作中,我们经常遇到RAW文件(.nef)和对应的配置文件(.xmp)需要成对管理的情况。这种文件对具有以下特征:

  • 完全相同的文件名基础
  • 不同的文件扩展名
  • 通常存储在相同目录层级

核心解决思路

通过Shell脚本实现自动化处理,主要分为三个步骤:

  1. 提取目录中所有NEF文件的基名
  2. 为每个基名查找匹配的XMP文件
  3. 使用tar命令进行配对压缩

完整实现代码

以下是经过实际验证的Bash脚本:

#!/bin/bash

# 设置工作目录(可根据实际情况修改)
WORK_DIR="/path/to/photos"

# 进入目标目录
cd "$WORK_DIR" || exit 1

# 主处理循环
find . -name "*.nef" | while read -r nef_file; do
    # 获取不带扩展名的文件名
    base_name=$(basename "${nef_file%.*}")
    
    # 获取所在目录
    dir_name=$(dirname "$nef_file")
    
    # 构建压缩包名称
    tgz_name="${dir_name}/${base_name}.tgz"
    
    # 执行压缩命令
    tar -czf "$tgz_name" "${dir_name}/${base_name}".*
    
    # 可选:验证压缩结果
    if [ $? -eq 0 ]; then
        echo "成功创建压缩包: $tgz_name"
    else
        echo "压缩失败: $base_name" >&2
    fi
done

进阶优化方案

对于更复杂的场景,可以考虑以下增强功能:

1. 并行处理加速

# 使用GNU parallel加速处理
find . -name "*.nef" | parallel -j 4 'base={/.}; dir={//}; tar -czf "${dir}/${base}.tgz" "${dir}/${base}".*'

2. 增量压缩控制

# 仅压缩新文件或修改过的文件
find . -name "*.nef" -newer reference.file | while read -r nef_file; do
    # 原有处理逻辑...
done

注意事项

  • 脚本执行前建议先备份原始文件
  • 处理大量文件时注意磁盘空间
  • 可通过添加-v参数查看详细压缩过程
  • Windows系统可通过WSL或Cygwin环境运行

实际应用案例

某商业摄影机构使用此方案后:

处理文件量 原始大小 压缩后大小 节省空间
15,682对 1.2TB 987GB 约18%