通过提取与模式匹配的文件名部分来重命名文件

通过提取与模式匹配的文件名部分来重命名文件

我想知道可以使用哪个命令来重命名这样的文件。

例如,旧文件名是:

0_predict-1-500.png
0_predict-2-500.png
0_predict-3-500.png
1_predict-1-500.png
1_predict-2-500.png
1_predict-3-500.png
2_predict-1-500.png
...so on...

我期望的是用类似 的格式提取它们{filename}_predict-{times}-{rounds}.png,然后我可以将其替换为另一种模式,例如{filename}.png-result-{times}.png

因此,上述文件名将被更改以匹配模式:

0.png-result-1.png
0.png-result-2.png
0.png-result-3.png
1.png-result-1.png
1.png-result-2.png
1.png-result-3.png
2.png-result-1.png
...so on...

有人有 Linux 命令/工具来做这样的事情吗?我不想编写 Python 脚本来完成这个任务。

答案1

我刚刚发现有一个工具可以轻松地在 GNU/Linux 中操作文件名,它是毫米波。这比发布的答案容易得多。

就我而言,

mmv "*_predict-*-*.png" "#1.png-result-#2.png"

它尝试用通配符模式替换每个部分,因此,我们可以使用 、 等重复使用该#1部分#2

答案2

在重命名命令的帮助下,您可以编辑它,我假设所有文件都在同一目录中,并且您想要重命名所有 .png文件.:

find -name \*.png -exec sh -c 'x=$( rename -v 's/_predict/.png-result/g' $0 ) ;  rename  's/-500//g' "${x##*\./}" ;' {} \;

在文件所在的目录中运行此命令。

所以基本上它运行两次 rename 命令,第一次是删除_predict,第二次是删除-500

我在这里使用是x=$( rename -v 's/_predict/.png-result/g' $0 )因为在第一次更改文件名后,我将这个新名称存储在变量中x,然后使用该值进行第二次修改。

使用命令rename 's/-500//g' "${x##*\./}" ;是因为 x 的值就像这样./0_predict-1-500.png renamed as ./0.png-result-1-500.png,所以我只想0.png-result-1-500.png并且${x##*\./}会这样做。

答案3

也试试

$ for FN in *.png; do IFS="_-." read F P T R X <<< "$FN"; echo mv "$FN" "$F.$X-result-$T.$X"; done
mv 0_predict-1-500.png 0.png-result-1.png
mv 0_predict-2-500.png 0.png-result-2.png
mv 0_predict-3-500.png 0.png-result-3.png
mv 1_predict-1-500.png 1.png-result-1.png
mv 1_predict-2-500.png 1.png-result-2.png
mv 1_predict-3-500.png 1.png-result-3.png
mv 2_predict-1-500.png 2.png-result-1.png

echo如果对结果满意,则删除。我们循环遍历目标文件、read使用改编变量和“此处字符串”的文件名组件IFS,然后重新组装组件以形成命令所需的最终文件名mv

答案4

提及文件中需要重命名的所有文件

awk  '{print "mv -v" " " $1 " " substr($1,1,1)".png-result-"substr($1,11,1)".png"}' filename |sh


I have mentioned -v for verbose mode

This is how it shows output for renaming

awk  '{print "mv -v" " " $1 " " substr($1,1,1)".png-result-"substr($1,11,1)".png"}' filename|sh

`0_predict-1-500.png' -> `0.png-result-1.png'
`0_predict-2-500.png' -> `0.png-result-2.png'
`0_predict-3-500.png' -> `0.png-result-3.png'
`1_predict-1-500.png' -> `1.png-result-1.png'
`1_predict-2-500.png' -> `1.png-result-2.png'
`1_predict-3-500.png' -> `1.png-result-3.png'
`2_predict-1-500.png' -> `2.png-result-1.png'

相关内容