2013-03-19 67 views
1

我正在編寫一個腳本,用於檢查服務器中的空間並刪除舊備份/的空間小於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

不要chdir外部。使用Perl'chdir'內置函數:http://perldoc.perl.org/functions/chdir.html – 2013-03-21 05:05:03

回答

1

如果$backups[0]undef,那麼這意味着你的glob與任何文件都不匹配(大概是因爲那天沒有)。如果沒有找到文件,則不需要unlink任何東西。

因此改變unlink

unlink($backups[0]) if @backups; 

unlink($backups[0]) if $backups[0]; 
+0

謝謝你的工作 – mviswa 2013-03-20 05:48:08

1

如果你重寫它有點不同,你可以得到的Perl做檢測:

my @backups = glob "*NODE0000.CATN0000.$today_timestamp*"; 
unlink @backups; 

甚至

unlink glob "*NODE0000.CATN0000.$today_timestamp*"; # No conditionals! 

但我認爲File::Find是解決您的問題的正確方法。

+0

將檢查File :: Find ........ – mviswa 2013-03-19 12:28:14

+1

沒有必要使用'unlink for @ backups'只需使用'unlink @ backups'。實際上,在某些系統上,您可能需要多次調用['unlink'](http://p3rl.org/unlink「perldoc unlink」)才能獲取文件'1的所有版本,而unlink @ backups'。 – 2013-03-20 20:46:16

+0

@BradGilbert:沒有意識到'取消鏈接'接受名單! – Zaid 2013-03-21 04:52:42