【发布时间】: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