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,则执行实际删除。