【问题标题】: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 命令。

标签: bash perl batch-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 标志在不破坏旧文件的情况下移动文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 2011-07-11
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多