重命名文件以更改标点符号和编号

Modified on: Sat, 30 Jun 2018 08:40:30 +0800

我希望有更好的正则表达式技能的人可以帮我处理一些我需要重命名的文件。我需要一个命令来递归重命名Ubuntu中的大量jpg文件。

但是有一些问题。一组正常的文件看起来像ani-estate-villas_1431640729_3.jpgani-estate-villa_3627544278_7.jpgani-estate-villa_3143254376_5.jpg

我需要用-替换所有_,删除所有数字,然后添加在每个目录中重置的编号。因此,同一组文件应该看起来像ani_estate_villas_1.jpgani_estate_villas_2.jpgani_estate_villas_3.jpg,与其他文件相同其他目录。

递归的深度是1或2个目录深,所以你可能会找到directory/file.jpgdirectory/directory/file.jpg它几乎是随机的。

使用jpgs在每个目录中运行命令也是可行的,所以如果有人知道如何重命名具有这些特征的所有文件就没问题了。虽然运行一个命令更酷,但我非常感谢更多重复的解决方案,因为手动更改400+ jpg文件太多了。

我已经尝试了很多东西,但我甚至都没有接近,甚至不值得把它放在这里。我尝试使用krename但它删除了我的文件。所以,如果有人能指出我正确的方向,我会非常感激!

最佳答案

您可以使用prename < / a>命令根据用Perl编写的转换重命名文件。

让我们开始吧。要重命名目录中的所有.jpg文件,将所有-更改为_,我们只需使用s运算符(我们也可以使用tr)。执行Perl代码以转换每个文件名。

prename 's!-!_!g' *.jpg

为了将末尾的数字序列更改为简单的计数器,我们引入了一个计数器变量。我使用全局变量$a作为计数器(引入额外的变量更复杂)。正则表达式(\.[^/.]*)$与文件扩展名匹配,替换文本中的$1代表括号组匹配的内容。

prename 's!-!_!g; ++$a; s!_[0-9_]+(\.[^/.]*)$!_$a$1!' *.jpg

请注意,这些文件是按文件名参数给出的顺序重命名的,即*.jpg的扩展顺序决定了文件的编号。

或者,我们可以使用BEGIN块显式初始化计数器。

prename 'BEGIN {$a = 1;} s!-!_!g; s!_[0-9_]+(\.[^/.]*)$!_$a$1!; ++$a;' *.jpg

要在当前目录的每个子目录中执行此操作,请调用find

find -type d -exec sh -c 'cd "$1" && prename "$0" *.jpg' 's!-!_!g; ++$a; s!_[0-9_]+(\.[^/.]*)$!_$a$1!' {} \;
作者:,Gilles

相关问答

添加新评论