如何用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
指令说明:
- 拆分文件名:通过正则表达式
^(.*)_EXP(\d+)\.(.*)$将文件名拆分为基础名称(如one)、当前序号(如0)、扩展名(如dng)三部分。 - 获取同组所有序号:用
glob("$base_EXP*.$ext")匹配同一基础名称的所有文件,提取其中的序号存入数组。 - 计算最大序号:对序号数组降序排序后取第一个值,得到同组文件的最大序号。
- 生成新文件名:用「最大序号 - 当前序号」得到反转后的序号,拼接成新文件名。
如果需要同时完成移动目录和反转序号的操作,可合并两个参数:
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
相关产品推荐
相关产品推荐

