首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在终端中使用glob/regex模式重命名文件?

如何在终端中使用glob/regex模式重命名文件?
EN

Stack Overflow用户
提问于 2019-06-27 02:28:48
回答 1查看 136关注 0票数 0

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

我有三个文件:

代码语言:javascript
运行
复制
2019_12_10_Mike_Smith_item1.jpg
2016_06_24_John_Ward_item2.jpg
2011_11_18_Charlie_Coyle_item3.jpg

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

代码语言:javascript
运行
复制
YYYY_MM_DD_Fname_Lname_item#.jpg

我想将此文件重命名为以下格式:

代码语言:javascript
运行
复制
Fname_Lname_item#_YYYY_MM_DD.jpg

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

代码语言:javascript
运行
复制
Mike_Smith_item1_2019_12_10.jpg

我几乎没有在Terminal/Bash中工作的经验,在过去的几个小时里,我一直在寻找使用GLOB/REGEX实现这一点的方法。我熟悉正则表达式,但似乎不知道如何引用分组的项。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-06-27 02:43:42

下面是一种使用globs和bash的前缀/后缀删除功能的方法:

代码语言:javascript
运行
复制
for f in *.jpg; do
    g=${f%.jpg}
    mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"
done

示例

考虑一个包含以下文件的目录:

代码语言:javascript
运行
复制
$ ls *jpg
2011_11_18_Charlie_Coyle_item3.jpg  2016_06_24_John_Ward_item2.jpg  2019_12_10_Mike_Smith_item1.jpg

现在,运行我们的命令:

代码语言:javascript
运行
复制
$ for f in *.jpg; do g=${f%.jpg}; mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"; done

以下是以下文件:

代码语言:javascript
运行
复制
$ 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

这标志着循环的结束。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56779049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档