使用数学运算重命名文件
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
“解决”了它,您可能需要仔细检查您的文件及其内容。如果您以a001
、a011
和a021
开头并使用rename -f
,则最终将只有一个文件a031
,其中包含a001
的原始内容。 a011
和 a021
将被销毁。我认为这是/不是您想要的结果。【参考方案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 运算符一起使用的替换字符串中的占位符