我怎么能自动递增文件并重置它

时间:2011-08-16 19:56:04

标签: perl

我正在试图找出一种方法来组织文件夹中的文件 perl的。我的脚本的基础很简单。该脚本读取 根文件夹中的子文件夹,遍历每个文件夹,并使用 简单比较文件名中的前3位数到3 数字文件夹名称。如果它们不匹配,则将其置于右侧 的地方。

我的问题是,在查看文件时,我有时会运行 到重复的订单号。因为订单已经存在我 不能覆盖原来的,但这两个文件不能存在 同一个地方有明显的原因。所以我想出了这个想法 将单词_TEMP附加到文件名的末尾以便移动 他们可以稍后重命名。我现在遇到的问题 是我已经有两个重复。我正在寻找一种方法 允许TEMP标记在每次使用时递增1然后 每次循环重新开始时重置为零。我不是真的 确定我应该在哪里实现这个想法。

以下是该脚本的主要例程:

foreach my $office (keys %office_names) {

make_junk_folder($office);

# The matches and unmatches come back as array references!
my ($returned_matches, $returned_unmatches) = read_root_folder($office);

foreach my $folder (@$returned_matches) {
    my $returned_files = read_subfolder($office, $folder);

    foreach my $file (@$returned_files) {
        analyze_file($office,$folder,$file);
    }
}

foreach my $folder (@$returned_unmatches) {
    print "$folder\n";
    remove_root_junk($office,$folder);
}
}

这是处理文件移动和重命名的子程序:

sub analyze_file {

    my $office = shift;
    my $folder = shift;
    my $file = shift;

    my $order_docs_path = $office_names{$office};

    if ($file =~ /^(?<office> (C[AFL]|ME)) (?<folder_num> \d{3})
                   (?<file_num> \d{3}) ([_|\-] \d+)? \. (?<file_ext> pdf)
                   $/xmi) {

        my $file_office = uc($+{office});
        my $folder_num = $+{folder_num};
        my $file_num = $+{file_num};
        my $file_ext = lc($+{file_ext});

        # Change hyphens to a underscore
        $file_num =~ s/\-/_/;

        my $file_name = "$file_office" . "$folder_num" . "$file_num" .
                        "\." . "$file_ext";
        my $temp_name = "$file_office" . "$folder_num" . "$file_num" .
                        "_TEMP" . "\." . "$file_ext";

        if ($folder != $folder_num) {
            # If the folder does not exist create the folder
            if (! -e "$order_docs_path\\$folder_num") {
                system "mkdir $order_docs_path\\$folder_num";
            }

            # Check to see if the file already exists
            if ( -e "$order_docs_path\\$folder_num\\$file_name") {
                # Append the file with a "_TEMP".  These files are
                # missorted pages belonging to a larger document
                rename ("$order_docs_path\\$folder\\$file",
                        "$order_docs_path\\$folder_num\\$temp_name");
            } else {
                # Moves the file to correct place, these are mismatched files
                rename ("$order_docs_path\\$folder\\$file",
                        "$order_docs_path\\$folder_num\\$file_name");
            }
        } else {
            # Files are in the correct place, the file name will be
            # corrected only
            rename ("$order_docs_path\\$folder\\$file",
                    "$order_docs_path\\$folder_num\\$file_name");
        }
    }
}

一些示例文件名如下所示:

CF100145.pdf

CA310244.pdf

CL211745.pdf

CL211745_1.pdf(这表示第二页,来自我们的文档扫描仪)

ME102103.pdf

如果出现问题,则在更改相同作业时,而不是将文件放在应该去的位置,此人将更新的作业信息放入当前作业文件夹,该目录与文件中的前3个数字不匹配。所以稍后他们必须进行排序以解决错误,问题是只有一个办公室有超过500,000个文件,我们有4个办公室。

2 个答案:

答案 0 :(得分:1)

我会改变这一部分:

        if ( -e "$order_docs_path\\$folder_num\\$file_name") {
            # Append the file with a "_TEMPn".  These files are
            # missorted pages belonging to a larger document
            my $n = 1;
            while (-e "$order_docs_path\\$folder_num\\$temp_name") {
                $temp_name =~ s/TEMP\d*/TEMP$n/;
                $n++;
            }
            rename ("$order_docs_path\\$folder\\$file",
                    "$order_docs_path\\$folder_num\\$temp_name");
        } # ...

答案 1 :(得分:0)

您可以将_TEMP_OLD_FOLDER_NAME添加到其中。

在此文件夹中只有一个文件,因此没有文件具有相同的新名称