【问题标题】:Perl — create numbered backup copy of a filePerl — 创建文件的编号备份副本
【发布时间】: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;”吗?在代码的开头?

标签: perl file-exists file-copying


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多