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

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

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

我认为它应该是这样的:

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

有人能给我建议一个解决办法吗?

答案1

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

for i in *.png; do mv -v $i `basename $i .png`.test.png; done

答案2

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

rename expr file1 file2 file3

该命令使用 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

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

答案3

您可以使用rename接受正则表达式或这个基本的 3 个参数语法:

重命名 .png .test.png *.png
  • 第一个参数是文件名中要替换的内容
  • 第二个参数是用什么来替换它
  • 第三个参数是针对哪些文件执行操作,在本例中为所有 png。

相关内容