[英]How to check a file like this
我每天都在数据库上进行备份,文件名如下所示
AWDRT.0.db2inst1.NODE0000.CATN0000.20130312095740.001
AWDRT.0.db2inst1.NODE0000.CATN0000.20130313100330.001
GSRTC.0.db2inst1.NODE0000.CATN0000.20130313102253.001
我如何检查是否今天进行了备份,如果在CATN0000
之后看到,则附加时间戳,即YYYYMMDD
。 这样我就可以检查备份文件是否存在
在壳我曾经这样做
/home/ftpusr/backup/AWDRT.0.db2inst1.NODE0000.CATN0000.`date +%Y%m%d`*
我如何在Perl中做到这一点,以及如何清除旧的备份,就像下面在Shell中所做的那样
/home/ftpusr/backup/AWDRT.0.db2inst1.NODE0000.CATN0000.`date +%Y%m%d -d "$i days ago"`
感谢帮助
首先将目录更改为备份的位置(要添加到两个脚本中)
chdir ('/home/backups/vital');
列出今天的备份(本地时间)
$now = time();
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now);
$ymd = sprintf("%4d%02d%02d", $year+1900, $mon+1, $mday);
@backup = glob("*.CATN0000.$ymd*");
if ($#backup >= 0) {
print("Backup at $ymd: @backup\n");
}
else {
print("No backup at $ymd\n");
}
然后查找并删除n天前的文件(如果有多个文件匹配,则仅删除列表中的第一个文件)
$daysago = 3; # 3 days ago
$now = time();
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now - $daysago*3600*24);
$old = sprintf("%4d%02d%02d", $year+1900, $mon+1, $mday);
@oldbackup = glob("*.CATN0000.$old*");
if ($#oldbackup >= 0) {
print("Old Backup at $old: @oldbackup - removing (first one)\n");
unlink( $oldbackup[0] );
}
else {
print("No old backup at $old\n");
}
您也可以在perl中使用反引号。
$ perl -e"print qq(`date "+%Y%m%d"`)"
可以使用unlink()从perl中删除文件。
例如,检查文件是否存在
if ( -e $filename ) { die("File $filename exists") };
更新:
您也可以使用readdir并在文件名上使用正则表达式来完成此操作。
use Time::localtime
opendir(DIR, "/cygdrive/d/test/") || die("Error");
$backup_exists = 0;
$prefix = "CATN0000.";
while ($f = readdir(DIR)) {
$today_timestamp = sprintf('%4d%02d%02d', localtime->year()+1900, localtime->mon()+1, localtime->mday());
if ( $f =~ /$prefix$today_timestamp/ ) {
$backup_exists = 1;
}
}
closedir(DIR);
if ( $backup_exists ) {
print "Backup exists\n";
} else {
print "Backup does not exist\n";
}
更新2:但是上面的glob()版本更有效。 用那个
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.