1

サーバーのスペースをチェックし、古いバックアップを削除するスクリプトを書いています/'s is the space is less than 2 GB . スクリプトは正常に動作していますが、私が使用しているため、strict; を使用しています。警告を使用します。私の練習目的のスクリプトでは、このエラーがスローされます。

ここにスクリプトがあります

#!/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
4

2 に答える 2

1

少し違った書き方をすれば、Perl に検出をさせることができます:

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

あるいは

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

しかし、私File::Findはあなたの問題にアプローチする正しい方法だと思います。

于 2013-03-19T12:15:22.027 に答える
1

が の場合$backups[0]は、ファイルが一致しなかったundefことを意味します (おそらく、その日にファイルがなかったからです)。globファイルが見つからなかった場合は、unlink何もする必要はありません。

したがって、unlink行を次のように変更します

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

また

unlink($backups[0]) if $backups[0];
于 2013-03-19T11:41:14.053 に答える