我有大量带有名称的文件文件00.txt,文件01.txt等文件夹中。是否可以在终端中将所有数字更改为(4000+200*数字)的地方?我想要最终文件的名称为文件4000.txt,文件4200.txt等谢谢!!
答案1
如果您已经zsh
安装...
autoload zmv
zmv -n '(file)(<->)(.txt)' '$1$((4000+$2*200))$3'
-n
如果您对结果满意,请删除。
答案2
我通常会使用rename
它利用perlre
$ rename -v 's/^(file)(\d+)(\.txt)$/$1 . (4000+200*$2) . $3/e' *.txt
file00.txt renamed as file4000.txt
file01.txt renamed as file4200.txt
或者正如格伦·杰克曼在评论中建议的那样;
$ rename -v 's/(\d+)/4000 + 200*$1/e' file*.txt
解释:
这使用s/foo/bar/
替换foo
为 的语法bar
。
foo
是^(file)(\d+)(.txt)
。因此,该表达式将匹配任何以 开头foo
、包含 1 个或多个数字、后跟.txt
扩展名且没有其他内容的文件。 file
保存在捕获组 1 中、捕获组 2 中的数字以及.txt
捕获组 3 中。
然后我们bar
用新的文件名替换: $1 . (4200 + $2) . $3
.我们添加 4200 来捕获组 2(数字)并将其与$1
和连接起来$3
。
我们需要e
修饰符 ins/foo/bar/e
来确保(4000 + 200*$2)
串联被实际评估。
我添加了它-v
,因此它会打印更改的内容,但是在测试时,您将需要使用-n
它,以便它不会更改任何内容,直到您对它的实际功能感到满意为止。
该命令的最后一个参数rename
是*.txt
。这只是要评估的文件列表。由于我们对 中的扩展名进行了检查perlre
,因此我们可以*
在此处使用 a 。任何与 ( ) 不匹配的内容foo
都不会被更改。
这个答案使用file-rename
来自 Debian 的包改名它用于update-alternatives
提供/usr/bin/rename
.如果您没有安装该软件包,您可能已经rename.ul
安装了实用程序Linux。 rename.ul
使用不同的表达系统,并且不适用于我在这里描述的系统。
答案3
如果你不想重命名全部文件的名称,而您只想重命名一些内的文件的一定范围,然后是解决方案的修改版本这个答案到如何使用终端将具有连续名称的文件重命名为另一个序列?可能有一些用处。
例如,要file05.txt
通过 to file11.txt
to file5000.txt
to重命名file7200.txt
:
for index in {05..11}; do echo mv file"${index}".txt file"$((4000+index*200))".txt; done
它echo
只是为了测试该命令是否按照您的预期执行。echo
一旦输出看起来正确,请删除。
单位数字注释(数字<10)
file01.txt
对于to范围内的文件file09.txt
,0
必须在该范围内的单个数字之前添加 。因此,代替
for index in {5..11};
你会放
for index in {05..11};
对于两位数的范围,则0
不需要前面的内容。例如,对于 13 至 25:
for index in {13..25};