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 — 创建文件的编号备份副本的主要内容,如果未能解决你的问题,请参考以下文章