使用数学运算重命名文件

Posted

技术标签:

【中文标题】使用数学运算重命名文件【英文标题】:Rename files using math operations 【发布时间】:2018-05-26 18:11:45 【问题描述】:

我正在尝试使用 bash 命令重命名一些文件,但我不知道如何将算术表达式/数学运算添加到正则表达式中。

输入:

a000.png
a001.png
...

输出:

a010.png
a011.png
...

我正在尝试将 10 添加到名称中。

我尝试过的一些事情:

rename -n -e 's/a(\d+).png/a$1 + 10.png/' *
rename -n -e 's/a(\d+).png/a$1 + 10.png/' *
rename -n -e 's/a(\d+).png/a$($1 + 10).png/' *

有没有简单的方法来做到这一点?

【问题讨论】:

这里的诀窍是rename 命令使用perl 语法,而不是bash shell 语法。我手头没有一个好的、全面的资源来详细说明/表达这一点,但当我这样做时,我会附上我的答案。 我对链接到外部网站犹豫不决;那里有很多指南(谷歌搜索)。首先,您可以使用man perlre 粗略了解一下。 感谢您指出这一点,@TravisClarke。我会记住这个和你的答案以供将来参考,我喜欢rename 命令。 【参考方案1】:

这应该可以解决问题。如果您不想要前导零,您可以删除 sprintf 以及 "%03d" 格式字符串。此外,如果要重命名的文件总是a 开头,您还可以用文字字符a 替换前导正则表达式[a-zA-Z]*。最后,虽然* 文件说明符可能就足够了,但我还是建议添加一个扩展作为额外的安全预防措施(例如*.png)。

与往常一样,首先尝试使用-n 标志来验证重命名是否正确正确

rename -v 's/([a-zA-Z]*)([0-9]*)/$1.sprintf("%03d",$2+10)/e' *

【讨论】:

为了完整起见,Unix & Linux 上有一个 相似(不重复)线程,这可能会进一步说明问题。 这行得通,但如果我有很多文件,我会收到此错误:“a001.png 未重命名:a011.png 已存在”。我能够将所有内容重命名为“bXXX.png”,然后再改回“aXXX.png”,但有没有更简单的方法?我认为以相反的顺序对名称进行排序会起作用“ls |排序-r | rename ..." ,但它没有。 @klaus - 我想知道您是否会遇到这个问题...您的 ls | sort -r 反转顺序的解决方案确实有效,但您还必须删除* 来自 rename 命令的末尾,因为如果没有提供名称作为参数,它只会从 STDIN 读取文件名。 @DaveSherohman 它可以工作,但我认为使用ls | sort -r 可以解决重命名中的“已经存在”错误。但解决方案是改用“-f”。 @klaus - 嗯...如果您使用-f“解决”了它,您可能需要仔细检查您的文件及其内容。如果您以a001a011a021 开头并使用rename -f,则最终将只有一个文件a031,其中包含a001 的原始内容。 a011a021 将被销毁。我认为这是/不是您想要的结果。【参考方案2】:

如果您不想使用rename 重命名,您仍然可以使用 bash 语法。我有一堆旧日志需要 5 天转移,如下所示:

log.365.gz -> log.370.gz
log.364.gz -> log.369.gz
...

我使用了一个 for 循环倒数:

for date in 365..1; do
    mv -nv log.$date.gz log.$(date+5).gz
done

-n 标志在不破坏旧文件的情况下移动文件。

【讨论】:

以上是关于使用数学运算重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

通过重新格式化现有文件名来重命名文件 - 与 -replace 运算符一起使用的替换字符串中的占位符

使用管道运算符时将 dplyr 重命名应用于所有列

为啥linux无法重命名文件

文件夹为啥无法重命名?

重命名 Apache Apex 应用程序时,Kafka 运算符语义会发生变化吗?

文件批量重命名 如1-2 3-4 5-6