Perl — 创建文件的编号备份副本

Posted

技术标签:

【中文标题】Perl — 创建文件的编号备份副本【英文标题】:Perl — create numbered backup copy of a file 【发布时间】:2012-10-21 21:56:37 【问题描述】:

我正在将数据提取到某个文本文件,但首先我希望我的脚本检查文件是否存在,然后在某个文件夹中创建副本。如果它仍然存在于同一个文件夹中,请保存它,但根据最后一个文件的值附加值 _1 或 _2 ...。

这是我目前的脚本,

if (-e "/tmp/POP_Airtime_Week1.txt")

    copy("/tmp/POP_Airtime_Week1.txt","/tmp/POP") || die "cannot copy file";
    # If the file exists create a copy in /tmp/POP

    #################################
    # IF FILE EXISTS IN /tmp/POP copy the file but rename it to 
    # POP_Airtime_Week1_1.txt then increase the numbers each time
    # the script is run and a new copy needs to be created.
    ##################################

    unlink ("/tmp/POP_Airtime_Week1.txt");


如果/tmp/POP/POP_Airtime_Week1.txt 存在,则将其复制但另存为/tmp/POP/POP_Airtime_Week1_1.txt。下次我运行脚本并且/tmp/POP/POP_Airtime_Week1.txt 存在时,将其复制并保存为/tmp/POP/POP_Airtime_Week1_2.txt 等...

我该怎么做?

【问题讨论】:

缺少的只是一个循环和一个计数器。 为什么不使用现有的工具,比如 logrotate? 不应该有“use File::Copy;”吗?在代码的开头? 【参考方案1】:

你可以在目标文件存在时增加一个变量:

my $name = "POP_Airtime_Week1";
if (-e "/tmp/POP/$name.txt") 
    my $num = 1;
    $num ++ while (-e "/tmp/POP/$name\_$num.txt");
    copy("/tmp/$name.txt","/tmp/POP/$name\_$num.txt") or die "cannot copy file";
 else 
    copy("/tmp/$name.txt","/tmp/POP/$name.txt") or die "cannot copy file";

不过,请注意。如果您(或您和其他人)运行多个脚本实例,则可能会出现竞争条件。

【讨论】:

@JonathanLeffler:我只是认为这是一个未完成的文件名 :) 已修复。 试过我第一次运行它时,它会创建并复制一个新文件 /tmp/POP/POP_Airtime_Week1_1;下次我运行它时,/tmp/POP/POP_Airtime_Week1_2 不会创建,以前的数据也不会写入任何其他文件。但是 /tmp/POP_Airtime_Week1 已经被覆盖了。 @OmbongiMoraa:脚本从不覆盖原始文件。它只在 POP 子目录中创建副本。 对不起,忘了说我包含了 unlink ("/tmp/POP_Airtime_Week1.txt");就像我的问题一样。这允许删除文件的 /tmp 副本,因为我希望 /tmp/POP 处理旧副本。如果我不取消链接 /tmp 文件,那么我会得到它存在的错误并且我的脚本会过早终止。 @OmbongiMoraa:对我有用。如果文件存在,你会得到什么错误?您是否创建了/tmp/POP 目录?【参考方案2】:
 my $i = 0;
 my $fname = $file;
 for (;;) 
     last unless -f $fname;
     $i++;
     $fname = "$file_$i";
 
 # $fname is new unused file name, copy to it

【讨论】:

以上是关于Perl — 创建文件的编号备份副本的主要内容,如果未能解决你的问题,请参考以下文章

创建一个 perl 脚本来批处理文件

保存时将 .xlsm 的副本创建为 .xlsx

perl更新文件

VBA 无法打开包含动态名称的备份文件

在 PowerShell 中使用“备份”上下文创建卷影副本

Kafka日志存储