我正在尝试创建一种快速的方法来更改文件名的格式,以重新排列原始文件名。示例:
我有三个文件:
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我几乎没有在Terminal/Bash中工作的经验,在过去的几个小时里,我一直在寻找使用GLOB/REGEX实现这一点的方法。我熟悉正则表达式,但似乎不知道如何引用分组的项。任何帮助都将不胜感激。
发布于 2019-06-27 02:43:42
下面是一种使用globs和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这会在当前directory.
g=${f%.jpg}中的每个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这标志着循环的结束。
https://stackoverflow.com/questions/56779049
复制相似问题