使用文本文件中的数据清理文件名

使用文本文件中的数据清理文件名

我需要清理一堆文件夹文件名。可能还要清理文件标题。我目前正在使用这个 Perl 脚本可以做到这一点 但我遇到了一些问题。

  1. 如果文件名中的年份已经有括号,则会添加另一组。

  2. 我还想使用文本文件来删除标题中的常见“签名”,例如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$//;

?(使用\[\]防止[…]被解释为范围,并$引用字符串的结尾。

相关内容