我有许多名称为数字的png
和文件,例如,在目录中,jpg
0100.png
1
例如,如何分别添加0002.png
到它们的名称中,而不0003.png
覆盖?0001.png
0002.png
我怎样才能
2
从他们的名字中减去,这样0100.png
就不会变成098.png
而是0098.png
?
答案1
在这种情况下我可能最终会使用临时目录:
for file in [[:digit:]]*.png; do
echo mv $file tmp/$(printf %04d $((10#${file%.png}+1))).png
done
重要的部分是10#N
强制 bash 将其解释000N
为 just N
,否则前导零表示八进制数。
例如:
$ touch 0001.png 0002.png 0010.png 0020.png 0100.png 0200.png
$ for file in [[:digit:]]*.png; do echo mv $file tmp/$(printf %04d $((10#${file%.png}-1))).png; done
mv 0001.png tmp/0000.png
mv 0002.png tmp/0001.png
mv 0010.png tmp/0009.png
mv 0020.png tmp/0019.png
mv 0100.png tmp/0099.png
mv 0200.png tmp/0199.png
答案2
(1) 的解决方案
根据文件编号对文件进行排序,并从编号最大的文件开始重命名。这使得碰撞不可能发生。
ls *.png | sort -rn | while read ...; do ... mv ...; done
(2) 的解
确定位数(如果所有文件的位数不同),然后用于printf
保持该长度:
printf %04d.png 98
0098.png
答案3
使用 Perl 的rename
:
-2:
$ rename -n 's@\b\d+\b@sprintf("%04d", $& - 2)@e' 0100.png
0100.png -> 0098.png
+1:
$ rename -n 's@\b\d+\b@sprintf("%04d", $& + 1)@e' 0001.png 0002.png
0001.png -> 0002.png
0002.png -> 0003.png
-n
当您的测试有效时,您可以删除(空运行模式开关)。
还有其他同名的工具可能能够也可能无法做到这一点,所以要小心。
如果运行以下命令 ( linux
)
$ file $(readlink -f $(type -p rename))
你有一个像这样的结果
.../rename: Perl script, ASCII text executable
那么这似乎是正确的工具 =)
如果不是,则将其设为默认值(通常已经是这种情况)Debian
并衍生如下Ubuntu
:
$ sudo update-alternatives --set rename /path/to/rename
(替换为您的命令/path/to/rename
的路径。perl's rename
如果您没有此命令,请搜索包管理器来安装它或手动做
最后但并非最不重要的一点是,这个工具最初是由 Perl 之父 Larry Wall 编写的。