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

如何用ExifTool按规则移动文件并反转序号?原指令失效原因

问题1:目录移动指令失效原因分析

当前使用的指令为:

"-directory<%d\%f\%f.%e" DIR

失效原因如下:

  • 变量使用错误:%f是ExifTool中代表「完整原文件名(不含扩展名)」的变量,比如对one_EXP0来说,%f的值就是one_EXP0,而非你需要的去掉_EXP*后缀的基础名称one,因此会创建错误的目录名(如one_EXP0而非one)。
  • 多余的文件名拼接:-directory参数仅需指定目标目录路径,ExifTool默认会保留原文件名完成移动操作,指令中额外拼接的\%f.%e属于冗余内容,会导致路径格式错误。

正确的指令可通过Perl正则提取基础名称实现:

exiftool "-directory<%d/${filename; s/_EXP\d+$//}" DIR

解释:用正则表达式s/_EXP\d+$//去掉文件名末尾的_EXP加数字部分,得到基础名称作为目录名。


问题2:反转文件名末尾EXP序号的实现方法

要实现序号反转,需先获取同组文件的最大序号,再用「最大序号 - 当前序号」得到反转后的序号,可通过ExifTool结合Perl表达式完成:

exiftool "-filename<${filename; 
    my ($base, $currNum, $ext) = /^(.*)_EXP(\d+)\.(.*)$/;
    my @allNums = map { /_EXP(\d+)/ } glob("$base_EXP*.$ext");
    my $maxNum = (sort { $b <=> $a } @allNums)[0];
    $_ = "$base_EXP".($maxNum - $currNum).".".$ext
}" *.dng

指令说明:

  1. 拆分文件名:通过正则表达式^(.*)_EXP(\d+)\.(.*)$将文件名拆分为基础名称(如one)、当前序号(如0)、扩展名(如dng)三部分。
  2. 获取同组所有序号:用glob("$base_EXP*.$ext")匹配同一基础名称的所有文件,提取其中的序号存入数组。
  3. 计算最大序号:对序号数组降序排序后取第一个值,得到同组文件的最大序号。
  4. 生成新文件名:用「最大序号 - 当前序号」得到反转后的序号,拼接成新文件名。

如果需要同时完成移动目录和反转序号的操作,可合并两个参数:

exiftool "-filename<${filename; 
    my ($base, $currNum, $ext) = /^(.*)_EXP(\d+)\.(.*)$/;
    my @allNums = map { /_EXP(\d+)/ } glob("$base_EXP*.$ext");
    my $maxNum = (sort { $b <=> $a } @allNums)[0];
    $_ = "$base_EXP".($maxNum - $currNum).".".$ext
}" "-directory<%d/${filename; s/_EXP\d+$//}" *.dng

内容的提问来源于stack exchange,提问作者Roman Toasov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:16:01