Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 是否有安全运行脚本的方法_Perl - Fatal编程技术网

Perl 是否有安全运行脚本的方法

Perl 是否有安全运行脚本的方法,perl,Perl,我正在尝试删除服务器上的日志文件。但在脚本实际删除文件之前,我不想看到哪些文件将被删除。我的问题是,有没有一种方法可以显示哪些文件将被删除而不实际删除?最好超过一个参数 像这样: perl -- DeleteLogs.pl C:\Logs 14 -safeRun C:\Logs是保存日志的路径。 14是天数。应删除所有早于此参数的文件。 -safeRun这应该是一个参数,它告诉脚本打印出哪些文件将被删除,但不要删除 脚本 #!/usr/bin/perl use strict; use warn

我正在尝试删除服务器上的日志文件。但在脚本实际删除文件之前,我不想看到哪些文件将被删除。我的问题是,有没有一种方法可以显示哪些文件将被删除而不实际删除?最好超过一个参数

像这样:

perl -- DeleteLogs.pl C:\Logs 14 -safeRun
C:\Logs是保存日志的路径。
14是天数。应删除所有早于此参数的文件。
-safeRun这应该是一个参数,它告诉脚本打印出哪些文件将被删除,但不要删除

脚本

#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use Scalar::Util qw(looks_like_number);
use File::Basename;
use local::lib;
use Data::Dumper qw(Dumper);
use File::Basename;
use DateTime;
use DateTime::Format::Strptime;
use DateTime::Duration;
use POSIX qw(strftime);
use Time::Local;
use Time::Piece;
use Time::Seconds 'ONE_WEEK';


my $logPath = $ARGV[0];
my $leaveLog = $ARGV[1];
my $file;
my $filename;

if (not defined $logPath) {
    die "Need a correct path\n";
}

if (-d $logPath) {

    print "Directory exist\n";

    if (looks_like_number($leaveLog)) {

        print "Everything correct";
        DoDir($logPath);

    }
    else {

        die "$leaveLog isn't a correct Integer"
    }

}
else {

    die "Directory don't exist\n"
}

sub DoDir {

    my $dir = shift;

    opendir(DIR, $dir) || die "Unable to open $dir: $!";
    my(@files) = grep {!/^\.\.?$/} readdir(DIR);
    closedir(DIR);

    foreach (@files) {

        if (-d ($file = "$dir\\$_")) {
            print "Found a directory: $file\n";
            DoDir($file);
        }
        else {

            checkDate($file);
        }
    }
}

sub checkDate {

    $filename = basename($file);

    #Regex for pattern "Normalfall"
    #Bsp: 2019_07_02_TEST_SERVER_ALL.log
    if ($filename =~ m/^\D?20\d{2}_\d{2}_\d{2}_[\w_]+.log$/) {

        #Regex: "\D?" match any char thats not a digit.
        #       "\d{2}\_" expecting 2 random digits and underscore
        #       "[\w_]+." expecting 1 to unlimited word char. matches with underscore char
        #       "log"  matches with the characters log (case sensitive)
        NormalFile();


    }
    #wl-deploy-181205082159_TEST-server_server-2019.log
    elsif($filename =~ m/^wl-deploy-\d+_[\w\-_.]+\d+\.log$/) {

        #Regex: "^" asserts position at start of a line
        #       "wl-deploy-" matches the character (case sensitive)
        #       "\d+" matches with a digit [0-9]
        #       "[\w\-_.]+"
        #           "\w" matches any word char [a-zA-Z0-9]
        #           "\-" matches the char -
        #           "_." matches a single char in the list _.
        DeployFile();
    }
    #2019_06_30_TestAdapter_BackendLog.log.gz_2019-07-03
    elsif ($filename =~ m/^\D?20(\d{2}_){3}[\w_]+\.log\.gz_\D?20(\d{2}-){2}\d{2}$/) {

        #print "$filename: File match .log.gz\n";
    }
    #stdout.log.190529100348-190605092829.gz_2019-06-07
    elsif ($filename =~ m/^stdout\.log(\.\w+?-\w+?(\.gz_\d{4}-\d{2}-\d{2})?)?$/) {

        #Regex: "stdout" matches the chars
        #       "\." matches the char .
        #       "log" macthes the char log (case sensitive)
        #       "(\.\w+?-\w+?(\.gz_\d{4}-\d{2}-\d{2})?)?"
        #           "?" matches between zero and one times, as many times as possible
        #           "\w+?" matches aby word chars
        #           "+?" matches between one and unlimited times, as few times as possible
        #           "(\.gz_\d{4}-\d{2}-\d{2})?" 2nd Capturing Group
        #               "\d{4}" matches a digit (equal to [0-9])
        #               "\d{2}" matches a digit (equal to [0-9])
        #               "\d{2}" matches a digit (equal to [0-9])
        StdoutFile();
        #print "$filename: File match stdout\n";
    }
    #2019-01-13-18-45.wl-test.error
    elsif ($filename =~ m/^\D?20\d{2}\-\d{2}\-\d{2}\-\d{2}\-\d{2}\.[\w\-]+\.error$/) {

        #Regex: "[\w\-]"
        #       "\w" matches any word character
        #       "\-" matches the character - literally
        ErrorFile();
    }
    #TT_TestAccessImpl_Statistic0.log.lck
    elsif ($filename =~ m/^[\w]{2}\_[\w]+\.log\.lck$/) {

        #Regex:
        LckFile();
    }
    #server.log00335
    elsif ($filename =~ m/^server\.log(\d{5})?$/) {

        #print "$filename: File Match server\n";
        ServerFile();
    }
    #access.log00021
    elsif ($filename =~ m/^access\.log(\d{5})?$/) {

        #print "$filename: File match access\n";
    }
    else{

        print "$filename: don't match\n";
    }
}


sub NormalFile() {

    my $chars = substr($filename, 0 , 10);

    my $date_parser = DateTime::Format::Strptime->new(

        pattern  => '%Y_%m_%d',
        on_error => 'croak',
    );

    my $dt = $date_parser->parse_datetime($chars);
    my $day14 = DateTime->now->subtract (days => $leaveLog);
    my $cmp = DateTime->compare($day14, $dt);

    if ($cmp == -1 || $cmp == 0) {
        print "don't delete\n";
    }
    else {
        print "delete File: $file\n";
        unlink $file;
    }
}

sub DeployFile() {

    $filename =~ s/[^\d]//g;
    my $dateFromString = substr($filename, 0 , 6);

    my ($year, $month, $day) = unpack("(a2)*", $dateFromString);
    $year = "20".$year;

    my $dateFromFile = $year."_".$month."_".$day;

    my $date_parser = DateTime::Format::Strptime->new(

        pattern  => '%Y_%m_%d',
        on_error => 'croak',
    );

    my $dt = $date_parser->parse_datetime($dateFromFile);

    my $day14 = DateTime->now->subtract (days => $leaveLog);
    #print "$day14\n";

    my $cmp = DateTime->compare($day14, $dt);
    #print "$cmp\n";

    if ($cmp == -1 || $cmp == 0) {
        print "don't delete\n";
    }
    else {
        print "delete File: $file\n";
        unlink $file;
    }
}

sub LckFile {

    print "$filename delete\n";
}

sub ErrorFile {

    $filename = substr($filename, 0 , 10);
    $filename =~ s/-/_/g;

    my $date_parser = DateTime::Format::Strptime->new(

        pattern  => '%Y_%m_%d',
        on_error => 'croak',
    );

    my $dt = $date_parser->parse_datetime($filename);

    my $day14 = DateTime->now->subtract (days => $leaveLog);
    #print "$day14\n";

    my $cmp = DateTime->compare($day14, $dt);
    #print "$cmp\n";

    if ($cmp == -1 || $cmp == 0) {
        print "don't delete\n";
    }
    else {
        print "delete File: $file\n";
        unlink $file;
    }
}

sub StdoutFile {

    print "$filename\n";
    $filename =~ /^stdout\.log\.((?:\d+?)|unknown)-(\d+?)(?:\.gz_\d{4}-\d{1,2}-\d{1,2})?$/g;

    unless (defined $1 and defined $2) {
        warn "Log file '$filename' does not match regex\n";
        return;
    }

    if ($1 ne "unknown") {

        my $firstDate = substr($1, 0, 6);
        my ($year, $month, $day) = unpack("(a2)*", $firstDate);
        $year = "20" . $year;
        $firstDate = $year . "_" . $month . "_" . $day;
    }

    my $secondDate = substr($2, 0, 6);
    my ($year, $month, $day) = unpack("(a2)*", $secondDate);
    $year = "20" . $year;
    $secondDate = $year . "_" . $month . "_" . $day;

    my $date_parser = DateTime::Format::Strptime->new(

        pattern  => '%Y_%m_%d',
        on_error => 'croak',
    );

    my $dt = $date_parser->parse_datetime($secondDate);

    my $day14 = DateTime->now->subtract ( days => $leaveLog);
    #print "$day14\n";

    my $cmp = DateTime->compare($day14, $dt);
    #print "$cmp\n";

    if ($cmp == -1 || $cmp == 0) {
        print "don't delete\n";
    }
    else {
        print "delete File $file\n";
        unlink $file;
    }
}

sub ServerFile {
    #print "$filename delete\n";
}
我想:

1) 添加新的全局数组
my@dfiles

2) 更改所有
取消$file链接语句到
push@dfiles$file

3) 在显示文件的main末尾添加代码:

print "These are the files that would be deleted:\n";
for (@dfiles) {print; print "\n"}
我将让您决定如何处理文件是否被删除,无论是通过开关还是通过y/n提示符。但如果要删除文件,则只需:

for (@dfiles) {unlink $_}
我想:

1) 添加新的全局数组
my@dfiles

2) 更改所有
取消$file链接语句到
push@dfiles$file

3) 在显示文件的main末尾添加代码:

print "These are the files that would be deleted:\n";
for (@dfiles) {print; print "\n"}
我将让您决定如何处理文件是否被删除,无论是通过开关还是通过y/n提示符。但如果要删除文件,则只需:

for (@dfiles) {unlink $_}

您必须修改脚本,但我们无法告诉您如何修改,因为您尚未演示。或者,制作文件的副本并在那里运行脚本。@choroba添加了脚本,并基于该命令行选项(删除或不删除)设置一个标志(变量表示为“真”或“假”),然后根据该变量删除文件。为了很好地处理命令行选项,我通常设置一个
debug
标志。然后,如果debug true,它将
打印结果,如果设置为false,则执行实际删除。您必须修改脚本,但我们无法告诉您如何执行,因为您尚未显示脚本。或者,制作文件的副本并在那里运行脚本。@choroba添加了脚本,并基于该命令行选项(删除或不删除)设置一个标志(变量表示为“真”或“假”),然后根据该变量删除文件。为了很好地处理命令行选项,我通常设置一个
debug
标志。如果debug true,它将打印结果,如果设置为false,则执行实际删除。