如何通过删除除数字之外的所有内容来重命名多个文件?

myk*_*eli 3 shell bash filenames rename

我想重命名文件,如:

SL Benfica vs. SC Beira-Mar 136.mp4
SL Benfica vs. SC Beira-Mar 137.mp4
SL Benfica vs. SC Beira-Mar 138.mp4
SL Benfica vs. SC Beira-Mar Jogo 074.mp4
SL Benfica vs. SC Beira-Mar Jogo 082.mp4
SL Benfica vs. SC Beira-Mar Jogo 112.mp4
Run Code Online (Sandbox Code Playgroud)

但是这个

for f in *.mp4; do echo mv "$f" "${f//[^0-9]/}.mp4"; done
Run Code Online (Sandbox Code Playgroud)

在末尾添加“4”:

1364.mp4
1374.mp4
1384.mp4
0744.mp4
0824.mp4
1124.mp4
Run Code Online (Sandbox Code Playgroud)

我认为它与“mp4”中的“4”混淆。我该如何解决这个问题?

Fre*_*ddy 8

.mp4在进行替换之前删除后缀。

for f in *.mp4; do
  fname=${f%.mp4}
  mv -- "$f" "${fname//[^0-9]}.mp4"
done
Run Code Online (Sandbox Code Playgroud)

我添加--以防您的文件名以 a 开头-并删除了echo. 当心。


Adm*_*Bee 5

你是对的4,出现的是mp4扩展名。原因是您正在处理语句中的完整文件名,${f//[^0-9]/}以删除所有出现的非数字字符,其中包括.mp部分并4从结尾离开。

您可以sed出于以下目的使用:

for f in *.mp4; do
  newname="$(sed 's/^[^0-9]*//' <<< "$f")"
  mv "$f" "$newname"
done
Run Code Online (Sandbox Code Playgroud)

但一定要对其进行测试(正如您显然所做的那样,正如我从您的帖子中看到的那样)。