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

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

我需要一个命令来在 Ubuntu 中递归地重命名大量 jpg 文件。

但也存在一些问题。一组正常的文件看起来像ani-estate-villas_1431640729_3.jpgani-estate-villa_3627544278_7.jpg并且ani-estate-villa_3143254376_5.jpg

我需要将所有替换-_,删除所有数字,然后添加在每个目录中重置的编号。因此,同一组文件应该类似于ani_estate_villas_1.jpgani_estate_villas_2.jpg、 ,ani_estate_villas_3.jpg并且与其他目录中的其他文件相同。

递归的深度是 1 或 2 个目录深,因此您可能会发现 adirectory/file.jpgdirectory/directory/file.jpg它几乎是随机的。

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

我尝试使用 krename 但它删除了我的文件。

答案1

您可以使用prename根据写入的转换重命名文件的命令珀尔

让我们从简单开始吧。要重命名.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!' {} \;

相关内容