如何根据文件名将文件排序到目录?

gno*_*med 0 regex perl string-parsing

我有大量的文件来排序所有在一些可怕的约定中命名的文件.
这里有些例子:

(4)_mr__mcloughlin ____.txt
12__sir_john_farr ____.txt
(b)mr__chope ____.txt
dame_elaine_kellett-bowman ____.txt
dr__blackburn ______.txt

这些名称应该是不同的人(发言者).另一个IT部门的某个人使用一些脚本从大量的XML文件中生成了这些文件,但是如你所见,命名是不可思议的愚蠢.

我需要用每个人的多个文本文件对数万个这些文件进行排序; 每个都有一些愚蠢的东西使文件名不同,无论是更多的下划线或一些随机数.他们需要按说话者排序.

使用脚本执行大部分工作会更容易,然后我可以返回并合并应该使用相同名称或其他内容的文件夹.

我有很多方法可以考虑这样做.

  • 解析每个文件中的名称,并将它们分类到每个唯一名称的文件夹中.
  • 从文件名中获取所有唯一名称的列表,然后查看这个类似的唯一名称的简化列表,并询问它们是否相同,一旦确定了它,它将相应地对它们进行排序.

我打算使用Perl,但如果它值得,我可以尝试一种新语言.我不知道如何将目录中的每个文件名一次一个地读入字符串以解析为实际名称.我不完全确定如何在perl中使用正则表达式进行解析,但这可能是可谷歌的.

对于排序,我只是要使用shell命令:

`cp filename.txt /example/destination/filename.txt`
Run Code Online (Sandbox Code Playgroud)

但只是因为这就是我所知道的所以它是最简单的.

我甚至没有关于我要做什么的伪代码的想法,所以如果有人知道最好的行动顺序,我的耳朵.我想我正在寻找很多帮助,我对任何建议持开放态度.许多人感谢任何可以提供帮助的人.

B.

Leo*_*ans 5

我希望我理解你的问题,这有点暧昧恕我直言.此代码未经测试,但应该按我认为您的要求执行.

use File::Copy;

sub sanatize {
    local $_ = shift;
    s/\b(?:dame|dr|mr|sir)\b|\d+|\(\w+\)|.txt$//g;
    s/[ _]+/ /g;
    s/^ | $//g;
    return lc $_;
}

sub sort_files_to_dirs {
    my @files = @_;
    for my $filename (@files) {
        my $dirname = sanatize($filename);
        mkdir $dirname if not -e $dirname;
        copy($filename, "$dirname/$filename");
    }
}
Run Code Online (Sandbox Code Playgroud)