使用基于文件名的bash和Perl批量重命名文件

Sil*_*dow 5 regex linux bash shell perl

我正在寻找仅在当前目录中批量重命名文件并从文件名末尾删除某些字符串.

样品:

foo-bar-(ab-4529111094).txt
foo-bar-foo-bar-(ab-189534).txt
foo-bar-foo-bar-bar-(ab-24937932201).txt
Run Code Online (Sandbox Code Playgroud)

输出应如下所示:

foo-bar.txt
foo-bar-foo-bar.txt
foo-bar-foo-bar-bar.txt
Run Code Online (Sandbox Code Playgroud)

我想删除-(ab-2492201)每个文件名末尾的字符串,知道数字的长度可能会有所不同.

Perl正则表达式优于模块而不使用任何实用程序,并且对于bash oneliner命令是高度优选的.

如何在Linux上的Perl和Bash Shell中实现这一点?有兴趣知道两种解决方案.

Smy*_*ers 5

尝试:

$ rename 's/-\(ab-\d+\)(?=\.txt$)//' *.txt
Run Code Online (Sandbox Code Playgroud)

有一个rename用Perl编写的命令.它的第一个参数是描述如何转换文件名的Perl代码.您可以s///在自己的Perl程序或单行程序中使用相同的命令.

如果这不起作用,请尝试prename代替rename; rename在某些系统上安装了一个不同的,基于非Perl的命令,在这种情况下可以调用Perl prename.

  • 显然有不止一个命令叫做“rename”;一些 Linux 发行版带有一个工作方式不同的非 perl 版本。请参阅:http://stackoverflow.com/questions/22577767/get-the-perl-rename-utility-instead-of-the-built-in-rename (2认同)

lar*_*sks 5

在 bash 中,你可以这样写:

for file in *-\(ab-[0-9]*\)*; do
    newfile="${file/-(ab-[0-9]*)/}"
    mv "$file" "$newfile"
done
Run Code Online (Sandbox Code Playgroud)


Jon*_*mar 5

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

通过find、perl、 和xargs,您可以使用这一行

find . -type f | perl -pe 'print $_; s/input/output/' | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)

不打电话的结果mv应该是

OldName NewName
OldName NewName
OldName NewName
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

  1. find . -type f输出文件路径(或文件名...您可以在此处控制正则表达式处理的内容!)
  2. -p打印要由正则表达式处理的文件路径,-e执行内联脚本
  3. print $_首先打印原始文件名(独立于-p)
  4. -n2每行打印两个元素
  5. mv获取上一行的输入