首页 > 解决方案 > 使用任何扩展名重命名 perl 文件

问题描述

只要文件名相同,我希望能够重命名不同扩展名的 perl 文件。例如,

ExampleFile.txt
ExampleFile.html
FirstFile.txt

我想要一个可以在 Linux 上使用的 Perl 单行器来更改包含字符串“ExampleFile”作为名称的文件,无论其扩展名为“FinalFile”,但不适用于任何其他文件,例如“FirstFile”。我正在调查,rename但我似乎无法弄清楚如何将它用于任何文件扩展名。

做类似的事情rename "$findstring.*", "$replacestring.*";似乎不起作用,因为 perl 无法识别*代表任何文件扩展名。

这是一个显示我的问题的示例代码。

#!/usr/bin/perl
use strict;
use warnings;

my $findstring = "ExampleFile";
my $replacestring = "FinalFile";

rename ("myDir/$findstring.*", "myDir/$replacestring.*"); 

标签: regexlinuxperlglob

解决方案


有一个工具rename,我相信大多数系统都带有它(例如,CentOS7 有它)

手册页很简短,包含概要和描述

重命名[选项]表达式 替换 文件...

rename将通过将其名称中第一次出现的表达式替换为替换来重命名指定的文件。

其次是一个,不完全是基本的,但希望清晰和有用的例子。

在你的情况下

rename ExampleFile NewName ExampleFile.*

应该是你所需要的。


另一种方法是在 Perl 中执行此操作

perl -MFile::Basename -MFile::Copy=move -wE'
    for (@ARGV) {
        ($name, $path, $ext) = fileparse($_, qr/\.[^.]*/);
        say "Rename: $_  to  $path/NewName$ext";
        #move $_, "$path/NewName$ext" 
    }
' ExampleFile*

一旦您ExampleFile.*取消NewName注释带有move. 就目前而言,它只打印它会做什么,因此可以首先对其进行彻底测试。

它使用File::Basename ::fileparse 查找在命令行上提交的每个文件的文件名组成部分,然后使用File::Copy重命名每个文件。还有其他方法可以解析文件名和其他要调用的模块。

这是一个用于快速复制粘贴测试的命令行程序;请将其转换为脚本,并进行适当的错误检查。然后,您可以使用Getopt::Long制作一个具有更好调用效果的实用工具。


推荐阅读