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

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

我想重命名文件,例如:

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

但是这个

for f in *.mp4; do echo mv "$f" "${f//[^0-9]/}.mp4"; done

在末尾添加“4”:

1364.mp4
1374.mp4
1384.mp4
0744.mp4
0824.mp4
1124.mp4

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

答案1

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

for f in *.mp4; do
  fname=${f%.mp4}
  mv -- "$f" "${fname//[^0-9]}.mp4"
done

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

答案2

你是对的,4出现的就是来自mp4扩展程序。原因是您正在处理满的filename${f//[^0-9]/}语句中删除所有出现的非数字字符,其中包括该.mp部分并保留4结尾处的 。

您可以用于sed以下目的:

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

但一定要测试它(正如你显然所做的那样,正如我从你的帖子中看到的那样)。

答案3

使用prename你可以运行一些类似的东西

prename 's/^\D*//' *.mp4

笔记:

  • \D 非数字
  • ^\D*文件名开头的非数字序列
  • s/^\D*//删除开头的非数字,并重命名

在某些 Linux 发行版(例如 Ubuntu)中,该命令称为rename,而在其他发行版(例如 Arch)中,该命令称为perl-rename

相关内容