Perl 我如何自动增加一个文件并重置它

Perl 我如何自动增加一个文件并重置它,perl,Perl,我正试图找到一种方法,用 perl。我脚本的基础有点简单。脚本读取 根文件夹中的子文件夹,遍历每个文件夹,并使用 将文件名中的前3位数字与3位数字进行简单比较 数字文件夹名称。如果它们不匹配,它会将其置于右侧 地点 我的问题是,在查看文件时,我有时会运行 输入一个重复的订单号。因为订单已经存在,我 无法覆盖原始文件,但该文件中不能存在这两个文件 同样的地方有明显的原因。所以我想出了一个主意 将单词\u TEMP附加到文件名的末尾,以便移动 它们可以在以后重命名。我现在遇到的问题 当我已经有两个副

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

我的问题是,在查看文件时,我有时会运行 输入一个重复的订单号。因为订单已经存在,我 无法覆盖原始文件,但该文件中不能存在这两个文件 同样的地方有明显的原因。所以我想出了一个主意 将单词
\u 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");
        }
    }
}
子分析\u文件{
我的办公室=班次;
我的$folder=shift;
我的$file=shift;
我的$order\u docs\u path=$office\u names{$office};
如果($file=~/^(?(C[AFL]|ME))(?\d{3})
(?\d{3})([\u124; \-]\ d+)\。(?pdf)
$/xmi){
我的$file_office=uc($+{office});
我的$folder_num=$+{folder_num};
我的$file\u num=$+{file\u num};
我的$file\u ext=lc($+{file\u ext});
#将连字符更改为下划线
$file\u num=~s/\-/\u/;
我的$file\u name=“$file\u office”。$folder\u num”。“$file\u num”。
“\.”“$file\u ext”;
我的$temp_name=“$file_office”。$folder_num”。“$file_num”。
“\u TEMP”“\.”“$file\u ext”;
如果($folder!=$folder\u num){
#如果该文件夹不存在,请创建该文件夹
if(!-e“$order\u docs\u path\\$folder\u num”){
系统“mkdir$order\u docs\u path\\$folder\u num”;
}
#检查文件是否已存在
如果(-e“$order\u docs\u path\\$folder\u num\\$file\u name”){
#将文件附加一个“_TEMP”。这些文件是
#属于较大文档的错误页面
重命名($order\u docs\u path\\$folder\\$file),
“$order_docs_path\\$folder_num\\$temp_name”);
}否则{
#将文件移动到正确的位置,这些文件不匹配
重命名($order\u docs\u path\\$folder\\$file),
“$order\u docs\u path\\$folder\u num\\$file\u name”);
}
}否则{
#如果文件位于正确的位置,则文件名将为
#仅更正
重命名($order\u docs\u path\\$folder\\$file),
“$order\u docs\u path\\$folder\u num\\$file\u name”);
}
}
}
一些示例文件名如下所示:

CF100145.pdf

CA310244.pdf

CL211745.pdf

CL211745_1.pdf(这表示文档扫描仪的第二页)

ME102103.pdf


发生问题的地方是当同一个作业发生更改时,该人员没有将更新的作业信息放入当前作业文件夹中,而是将该文件放在应该放在的位置,目录与文件中的前3个数字不匹配。因此,为了解决错误,以后必须对它们进行排序,问题是一个办公室中有超过500000个文档,我们有4个办公室。

我将更改这一部分:

        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");
        } # ...

我会更改这部分:

        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");
        } # ...

您可以向其中添加_TEMP_OLD_FOLDER_NAME


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

您可以将_TEMP_OLD_folder_name添加到该文件夹中


在这个文件夹中只有一个文件,所以没有文件会有相同的新名称

我不认为这个
[\u124; \-]
会像你想象的那样。它匹配下划线、管道或连字符。我猜您的意思是匹配下划线或连字符的
[\u-]
。虽然可以从正则表达式推断出文件名,但如果您给出一些示例,会容易得多。当然我可以给出一些示例,但我不确定需要什么。@Jim Davis,很高兴知道,我认为这是在regexp中执行OR操作的方法。我不认为这个
[\u124; \-]
做了您认为它做的事情。它匹配下划线、管道或连字符。我猜您的意思是匹配下划线或连字符的
[\u-]
。虽然可以从正则表达式推断出文件名,但如果您给出一些示例,会容易得多。当然我可以给出一些示例,但我不确定需要什么。@Jim Davis,很高兴知道,我认为这是在regexp中执行OR操作的方法。您的想法非常有效,甚至更好,它提供了我需要的解决方案,以便直接对文件重新编号,而不必使用
TEMPn
标记并单独处理这些文件。非常感谢。您的想法非常有效,甚至更好,它提供了我需要的解决方案,以便直接对文件重新编号,而不必使用
TEMPn
标记并单独处理这些文件。谢谢。