例如,我有命名为0-n.jpg
1到 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
如果你有zsh
shell,你可以执行如下操作。
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 的数字。结果是所有有问题的文件都将被重命名。