regex - 使用任何扩展名重命名 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.*");
解决方案
有一个工具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制作一个具有更好调用效果的实用工具。
推荐阅读
- java - 配置 OpenJFX 11 以将其 DLL 提取到不同的用户指定目录?
- c++ - 在头文件中使用 lambda 定义 priority_queue
- javascript - JavaScript 对象数组和打印
- google-cloud-filestore - 通过 IP 地址或互联网访问 Google Cloud Filestore
- android - Android Project Import to Eclipse 不在 Import Projects 窗口中显示项目名称,而是在“PTPlayer”中显示 - 项目未正确导入
- python - Python Bin、排序、Recusion 和索引号
- html - 围绕浮动到右侧的图像对齐文本
- events - 使用事件驱动微服务时,向用户返回数据的最佳方式是什么?
- c# - Newtonsoft json将复杂对象反序列化为具有不同名称的类
- javascript - 在 NetSuite 中打印 PDF 并选择多条交易记录