我正在编写一个脚本来检查服务器中的空间并删除旧备份/ s的空间小于2 GB。脚本工作正常,但因为我使用严格;使用警告;在我的脚本中,为了我的练习目的,这个错误被抛弃了。
这是脚本
#!/usr/bin/perl
use strict;
use warnings;
my @backups;
my $now=time();
my $dayago=10;
my (@space,@freesp);
@space=grep /\/dev\/md0/,`df`;
for(@space){
chomp;
@freesp=split /\s+/ ,$_;
}
chdir '/home/ftpusr/backup' or die "Can't cd to backup dir: $!\n";
while (($freesp[3]/1024/1024 < 2.0) && ($dayago > 0)){
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now-$dayago*60*60*24);
my $today_timestamp=sprintf("%4d%02d%02d",$year+1900,$mon+1,$mday);
@backups = glob("*NODE0000.CATN0000.$today_timestamp*");
#print "@backups\n";
$dayago -= 1;
#print "$dayago\n";
unlink ($backups[0]);
}
我已将$ dayago参数初始化为10,以便它检查过去10天的备份并接近当前日期,因此据我所知,对于while循环的第一次迭代,它没有找到具有该特定文件的特定文件时空,所以它无法链接所以抛出这个警告。有什么办法可以消除这个警告吗?
这是我运行脚本时的O / P
9
Use of uninitialized value in unlink at purge3.pl line 26.
8
Use of uninitialized value in unlink at purge3.pl line 26.
7
Use of uninitialized value in unlink at purge3.pl line 26.
6
Use of uninitialized value in unlink at purge3.pl line 26.
5
Use of uninitialized value in unlink at purge3.pl line 26.
4
Use of uninitialized value in unlink at purge3.pl line 26.
GSRTC.0.db2inst1.NODE0000.CATN0000.20130315102900.001
3
GSRTC.0.db2inst1.NODE0000.CATN0000.20130316150941.001 GSRTC.0.db2inst1.NODE0000.CATN0000.20130316171526.001
2
1
Use of uninitialized value in unlink at purge3.pl line 26.
GSRTC.0.db2inst1.NODE0000.CATN0000.20130318095532.001
0
目录中的文件将被列出,我需要删除它们
GSRTC.0.db2inst1.NODE0000.CATN0000.20130315102900.001
GSRTC.0.db2inst1.NODE0000.CATN0000.20130316150941.001
GSRTC.0.db2inst1.NODE0000.CATN0000.20130318095532.001
AWDRT.0.db2inst1.NODE0000.CATN0000.20130319092156.001
GSRTC.0.db2inst1.NODE0000.CATN0000.20130319095258.001
答案 0 :(得分:1)
如果$backups[0]
为undef
,则表示您的glob
与任何文件都不匹配(可能是因为当天没有任何文件)。如果没有找到文件,则无需unlink
任何内容。
所以将unlink
行更改为
unlink($backups[0]) if @backups;
或
unlink($backups[0]) if $backups[0];
答案 1 :(得分:1)
如果你稍微改写一下,你可以让Perl进行检测:
my @backups = glob "*NODE0000.CATN0000.$today_timestamp*";
unlink @backups;
甚至
unlink glob "*NODE0000.CATN0000.$today_timestamp*"; # No conditionals!
但我认为File::Find
是解决问题的正确方法。