如何重命名为固定长度

如何重命名为固定长度

例如,我有命名为0-n.jpg1到 500 的文件。n

问题是有些使用 Windows 的人没有使用前导零,所以当我这样做时,ls我得到

0-100.jpg
0-101.jpg
...
0-10.jpg
...
0-199.jpg
0-19.jpg
0-1.jpg

所以我想重命名它们以插入前导零,以便结果ls可以是

0-001.jpg
0-002.jpg
...
0-100.jpg
...
0-499.jpg
0-500.jpg

换句话说,我希望所有文件具有相同的文件名长度。

我试过这个解决方案但我收到了一系列错误,例如

bash: printf: 0-99: invalid number

答案1

如果您的系统有基于 perl 的rename命令,您可以执行类似的操作

rename -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg

使用-v(详细)和-n(无操作)选项对其进行测试:

$ rename -vn -- 's/(\d+)-(\d+)/sprintf("%d-%03d",$1,$2)/e' *.jpg
0-10.jpg renamed as 0-010.jpg
0-19.jpg renamed as 0-019.jpg
0-1.jpg renamed as 0-001.jpg

答案2

如果你有zshshell,你可以执行如下操作。

zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

测试

touch 0-1.jpg
touch 0-23.jpg
touch 0-345.jpg
touch 0-6.jpg
touch 0-05.jpg

将外壳更改为zsh,如果zmv未加载,您可以这样做autoload zmv

现在,您可以-n向命令添加标志zmv以查看执行该zmv命令会发生什么。我正在运行命令,

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'

输出是,

zmv -n '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'
mv -- 0-05.jpg 0-005.jpg
mv -- 0-1.jpg 0-001.jpg
mv -- 0-23.jpg 0-023.jpg
mv -- 0-6.jpg 0-006.jpg

如果您对文件名正确重命名感到满意,则可以删除该-n标志。

参考

感谢用户 Gnouc 澄清了我对这个问题的疑问,我已将其作为另一个问题发布以获得此解决方案,并且 Gnouc 答案的链接是一。

答案3

如果您没有“重命名:”,则另一种解决方案

for file in *.jpg; do
   [ -f "$file" ] || continue  #skips if no jpg file present in current dir
   echo "${file}" | awk -F'[-.]' '
      {   new=sprintf("%03d",$2); 
          print "echo TESTING mv ", $0," ",$1"-"new"."$3 
      }'
done | bash

(编辑:移动了| bash所以它只被调用一次,而不是每个文件一次。并且这个快速循环不是“奇怪的文件名”友好的,但可以进一步清理(以处理带有空格的文件等))

一旦你确定它正在做你想要它做的事情,就删除这两个词echo TESTING来真正做。mv ...

答案4

这是另一种方法。由于您只需要重命名文件的特定子集,并且您已经知道这些文件是什么,因此只需列出它们并重命名它们:

for i in {1..99}; do mv -- 0-$i.jpg 0-$(printf '%03d\n' $i).jpg; done

这将列出从 1 到 99 的数字,并将每个值保存为$i.您不关心其余的,因为它们已经正确命名。然后,您可以重命名0-$i.jpg为填充后的版本。如果长度小于 3 个字符,该printf %03d指令将打印一个在左侧添加 0 的数字。结果是所有有问题的文件都将被重命名。

相关内容