Unix Bash 使用正则表达式重命名文件

mxg*_*mxg 4 bash rename mv

我想使用正则表达式重命名文件夹中的所有文件(在名称末尾添加名称)并移动到另一个文件夹。

在我看来,它应该是这样的:

mv -v ./images/*.png ./test/*test.png,但它不起作用。

谁能建议我一个解决方案?

qua*_*ote 7

在基于 Debian 的系统(包括 Ubuntu)上,有一个方便的 perl 文件重命名脚本与主要的 Perl 包一起安装。它通常被命名为rename,但有时也被称为prename(Perl 重命名)。像这样使用:

rename expr file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

该命令使用 Perl 来评估expr每个file参数,并将每个文件重命名为评估的输出expr。因此,对于像您的示例这样的简单正则表达式替换:

rename 's(images/(.*)\.png$)(test/$1.test.png)' ./images/*

# here's the expression:
# s()()   -- just like s/// (but i don't need to escape the / in the filename)
#   match regex:  images/(.*)\.png$     -- match filenames of the form images/*.png
#   replace:      test/$1.test.png     -- turn them into test/*.test.png
Run Code Online (Sandbox Code Playgroud)

如果文件与表达式不匹配(例如,非 PNG 文件),则替换不会执行任何操作,并且不会更改它们的文件名。


小智 6

我也喜欢 John T 发布的重命名命令,但它并非在所有系统上都可用。这应该适用于任何地方:

for i in *.png; do mv -v $i `basename $i .png`.test.png; done
Run Code Online (Sandbox Code Playgroud)

  • 为我工作:也许您应该尝试引用 $i 的实例:“$i” (2认同)