![重命名文件以更改标点符号和编号](https://linux22.com/image/103306/%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%E4%BB%A5%E6%9B%B4%E6%94%B9%E6%A0%87%E7%82%B9%E7%AC%A6%E5%8F%B7%E5%92%8C%E7%BC%96%E5%8F%B7.png)
我需要一个命令来在 Ubuntu 中递归地重命名大量 jpg 文件。
但也存在一些问题。一组正常的文件看起来像ani-estate-villas_1431640729_3.jpg
,ani-estate-villa_3627544278_7.jpg
并且ani-estate-villa_3143254376_5.jpg
我需要将所有替换-
为_
,删除所有数字,然后添加在每个目录中重置的编号。因此,同一组文件应该类似于ani_estate_villas_1.jpg
、ani_estate_villas_2.jpg
、 ,ani_estate_villas_3.jpg
并且与其他目录中的其他文件相同。
递归的深度是 1 或 2 个目录深,因此您可能会发现 adirectory/file.jpg
或directory/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!' {} \;