我需要清理一堆文件夹文件名。可能还要清理文件标题。我目前正在使用这个 Perl 脚本可以做到这一点 但我遇到了一些问题。
如果文件名中的年份已经有括号,则会添加另一组。
我还想使用文本文件来删除标题中的常见“签名”,例如
This.Movie.Blah.(2012) [1080p] MP4
。目前,我的脚本
.
按预期用空格替换了 ,并(xxxx)
在年份周围添加了 。运行脚本的结果将是This Movie Blah ((2012)) [1080p] MP4
。
另外我想从文件名中删除与文本文件值(带线的,不是 CSV)匹配的“签名”,这样This.Movie.Blah.(2012) [1080p] MP4
就会返回This Movie Blah (2012)
use warnings;
use strict;
use File::Copy;
my $oldname;
opendir(my $d, ".") or die $!;
while(readdir $d) {
if (-d $_ and $_ ne "." and $_ ne "..")
{
$oldname = $_;
$_ =~ s/\./ /g;
$_ =~ s/(\d{4})/($1)/g;
move($oldname,$_);
}
}
closedir $d;
我今天刚刚开始尝试学习 Perl,这是我的第一门编程语言之一,所以我对这种语言还比较陌生。
答案1
作为正则表达式的问题(在文本中搜索模式并根据模式进行替换),这并不难;我很惊讶 15 小时后没有答案。我对 Perl 的经验不如我想要的那样丰富,但解决括号中年份问题的一个直接方法是事后检测它然后修复它:
$_ =~ s/(\d{4})/($1)/g;
$_ =~ s/(\((\d{4})\))/$1/g;
第二条语句查找((2012))
并返回中间六个字符,即(2012)
。至于“通用签名”,
$_ =~ s/ \[1080p\] MP4$//;
?(使用\[
和\]
防止[…]
被解释为范围,并$
引用字符串的结尾。