对目录中所有文件的名称添加或减去一个数字

对目录中所有文件的名称添加或减去一个数字

我有许多名称为数字的png和文件,例如,在目录中,jpg0100.png

  • 1例如,如何分别添加0002.png到它们的名称中,而不0003.png覆盖?0001.png0002.png

  • 我怎样才能2从他们的名字中减去,这样0100.png就不会变成098.png而是0098.png

有关的https://stackoverflow.com/questions/26770060/subtracting-a-number-from-the-names-of-all-the-files-in-a-directory,但这里更困难。

答案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 编写的。

相关内容