【问题标题】:How do I use glob/regex patterns to rename files in terminal?如何使用 glob/regex 模式重命名终端中的文件?
【发布时间】:2019-06-26 18:28:47
【问题描述】:

我正在尝试创建一种快速更改文件名格式以重新排列原始文件名的方法。 示例:

我有三个文件:

2019_12_10_Mike_Smith_item1.jpg
2016_06_24_John_Ward_item2.jpg
2011_11_18_Charlie_Coyle_item3.jpg

这三个文件的文件格式是:

YYYY_MM_DD_Fname_Lname_item#.jpg

我想用以下格式重命名这个文件:

Fname_Lname_item#_YYYY_MM_DD.jpg

所以我们的第一个文件现在是:

Mike_Smith_item1_2019_12_10.jpg

我在终端/Bash 方面的工作经验很少,过去几个小时一直在寻找使用 GLOB/REGEX 的方法。我熟悉正则表达式,但似乎无法弄清楚如何引用分组项目。任何帮助将不胜感激。

【问题讨论】:

  • 许多正则表达式工具支持反向引用,即perl -pe 's/^((?:[^:_]+)_){3})(.*)\.jpg/\2_\1.jpg/'(尽管这也会在你不想要的地方移动一个下划线)。这里,\1 指的是第一个带括号的组,\2 指的是第二个。 (特别是 Perl 也将这些作为美元变量公开,并且更喜欢您使用它们。)
  • 如果您想在纯 bash 中执行此操作,您可以使用 ${BASH_REMATCH[$n]} 来引用匹配项(在您的情况下,$n 将是 1、2 或 3...)
  • 您的基本正则表达式模式可以是(\d{4}_\d{2}_\d{2})_(.*?)_(item\d+),然后使用您选择的工具按顺序划分组\2_\3_\1:regex101.com/r/otdT2h/1

标签: regex bash terminal glob


【解决方案1】:

这是一种使用 glob 和 bash 的前缀/后缀删除功能的方法:

for f in *.jpg; do
    g=${f%.jpg}
    mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"
done

示例

考虑一个包含这些文件的目录:

$ ls *jpg
2011_11_18_Charlie_Coyle_item3.jpg  2016_06_24_John_Ward_item2.jpg  2019_12_10_Mike_Smith_item1.jpg

现在,运行我们的命令:

$ for f in *.jpg; do g=${f%.jpg}; mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"; done

这些是后面的文件:

$ ls *jpg
Charlie_Coyle_item3_2011_11_18.jpg  John_Ward_item2_2016_06_24.jpg  Mike_Smith_item1_2019_12_10.jpg

工作原理

  • for f in *.jpg; do

    这将开始循环遍历当前目录中的每个 jpg 文件。

  • g=${f%.jpg}

    这会从文件名的末尾删除.jpg,并将结果分配给变量g

  • mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"

    这会将文件 $f 重命名为 ${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg${g#*_*_*_} 是删除日期后的文件名。 ${g%_${g#*_*_*_}} 是日期。

    下面是一个示例,展示了逐步发生的事情。让我们从给变量f分配一个文件名开始:

    $ f=2011_11_18_Charlie_Coyle_item3.jpg
    

    g 将是不带​​后缀的文件名:

    $ g=${f%.jpg}
    

    不带日期的文件名是:

    $ echo "${g#*_*_*_}"
    Charlie_Coyle_item3
    

    没有其余文件名的日期是:

    $ echo "${g%_${g#*_*_*_}}"
    2011_11_18
    
  • done

    这标志着循环的结束。

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 2016-02-08
    • 1970-01-01
    • 2011-07-20
    • 2021-07-23
    • 2011-07-31
    • 2014-02-27
    • 2014-07-28
    • 2017-10-28
    相关资源
    最近更新 更多