Linux perl while循环
在这段代码中,我解析了日志文件修改日期的文件(包含ls-lrt的输出)。然后,我将所有日志文件移动到一个新文件夹中,并将其修改日期添加到文件名中,然后对所有这些文件进行tar 我遇到的问题是Linux perl while循环,linux,perl,Linux,Perl,在这段代码中,我解析了日志文件修改日期的文件(包含ls-lrt的输出)。然后,我将所有日志文件移动到一个新文件夹中,并将其修改日期添加到文件名中,然后对所有这些文件进行tar 我遇到的问题是while循环。因为它正在读取所有文件的数据,while循环持续运行15次。我理解代码中存在一些问题,但我无法理解 在while循环中,我正在拆分ls-lrt记录以查找日志文件修改日期$file是ls命令的输出,我将其存储在文本文件/scripts/yagya.txt中以获取修改日期。但是while循环执行了
while
循环。因为它正在读取所有文件的数据,while循环持续运行15次。我理解代码中存在一些问题,但我无法理解
在while循环中,我正在拆分ls-lrt
记录以查找日志文件修改日期$file
是ls
命令的输出,我将其存储在文本文件/scripts/yagya.txt
中以获取修改日期。但是while
循环执行了15次,因为文件夹中有15个与模式匹配的日志文件
#!/usr/bin/perl
use File::Find;
use strict;
my @field;
my $filenew;
my $date;
my $file = `ls -lrt /scripts/*log*`;
my $directory="/scripts/*.log";
my $current = localtime;
my $current_time = $current;
$current_time = s/\s+//g;
my $freetime = $current_time;
my $daytime = substr($current_time,0,8);
my $seconddir = "/$freetime/";
system ("mkdir $seconddir");
open (MYFILE,">/scripts/yagya.txt");
print MYFILE "$file";
close (MYFILE);
my $data = "/scripts/yagya.txt";
my $datas = "/scripts/";
my %options = (
wanted => \&wanted,
untaint => 1
);
find (\%options, $datas);
sub wanted {
if (/[._]log\d*$/){
my $files;
my @fields;
my $fields;
chomp;
$files=$_;
open (MYFILE,$data);
while(<MYFILE>){
chop;
s/#.*//;
next unless /\S/;
@fields = (split)[5,6,7];
$fields = join('',@fields), "\n";
}
close (MYFILE);
system ("mv $files $seconddir$fields$files");
}
}
system ("tar cvf /$daytime/$daytime.tar.gz /$daytime/*log*");
system ("rm $seconddir*log*");
system ("rm $data");
#/usr/bin/perl
使用File::Find;
严格使用;
我的@field;
我的$filenew;
我的$date;
my$file=`ls-lrt/scripts/*log*`;
my$directory=“/scripts/*.log”;
my$current=本地时间;
我的$current\u time=$current;
$current_time=s/\s+//g;
my$freetime=$current\u time;
my$Day=substr($current_time,0,8);
我的$seconddir=“/$freetime/”;
系统(“mkdir$seconddir”);
打开(MYFILE,“>/scripts/yagya.txt”);
打印MYFILE“$file”;
关闭(MYFILE);
my$data=“/scripts/yagya.txt”;
my$datas=“/scripts/”;
我的%options=(
通缉=>\&通缉,
卸载=>1
);
查找(\%options,$datas);
通缉犯{
如果(/[.\]log\d*$/){
我的$文件;
我的@fields;
我的$fields;
咀嚼;
$files=$\ux;
打开(MYFILE$data);
while(){
印章;
s/#.*/;
下一个除非/\S/;
@字段=(拆分)[5,6,7];
$fields=join(“”,@fields),“\n”;
}
关闭(MYFILE);
系统(“mv$files$seconddir$fields$files”);
}
}
系统(“tar cvf/$daily/$daily.tar.gz/$daily/*log*”;
系统(“rm$seconddir*日志*”;
系统(“rm$数据”);
您的代码很难阅读。看起来,在开始测试之前,您已经将程序编写成了一大块。这种工作方式很常见,但非常错误。您应该从实现程序的一小部分开始,并在添加更多功能之前进行测试,然后再次测试,等等。这样,您就不会因为在一个未经测试的大型程序中一次解决许多问题而不知所措
如果您在程序顶部的use strict
中添加use warnings
,也会对您有很大帮助。它有助于捕捉您可能忽略的简单错误
另外,您是否知道File::Find
每次遇到文件时都会调用wanted
回调子例程?它不会一次传递所有文件
问题似乎是,当您找到与file::find
找到的当前文件相匹配的记录时,您应该停止读取yagya.txt
文件。您需要做的是检查ls
输出中的当前记录是否以当前文件的名称结尾。如果你这样写循环
while (<MYFILE>) {
if (/\Q$files\E$/) {
my @fields = (split)[5,6,7];
$fields = join('',@fields);
last;
}
}
use File::stat;
my $mtime = localtime(stat($files)->mtime);
这将为您提供一个字符串,如Wed Jun 13 11:25:23 2012
。我的ls
输出的日期只包括月份名称、月份的日期和日期的时间,如Jun 8 12:37
。这不是很具体,您可能至少应该包括一年,但是要从这个$mtime
生成相同的字符串,您可以编写
my $fields = join '', (split ' ', $mtime)[1,2,3];
关于你的计划,我还有很多话要说,但我希望这能让你现在开始
我注意到了另外两件事:
- 行
应该是$current\u time=s/\s+//g
,以删除当前时间字符串中的所有空格$current\u time=~s/\s+//g
- 像
这样的值将减少到Sun Jun 3 11:50:54 2012
,然后SunJun311:53:552012
将取不正确的值$day
SunJun31
- 您的代码很难阅读。看起来,在开始测试之前,您已经将程序编写成了一大块。这种工作方式很常见,但非常错误。您应该从实现程序的一小部分开始,并在添加更多功能之前进行测试,然后再次测试,等等。这样,您就不会因为在一个未经测试的大型程序中一次解决许多问题而不知所措
如果您在程序顶部的
use strict
中添加use warnings
,也会对您有很大帮助。它有助于捕捉您可能忽略的简单错误
另外,您是否知道File::Find
每次遇到文件时都会调用wanted
回调子例程?它不会一次传递所有文件
问题似乎是,当您找到与file::find
找到的当前文件相匹配的记录时,您应该停止读取yagya.txt
文件。您需要做的是检查ls
输出中的当前记录是否以当前文件的名称结尾。如果你这样写循环
while (<MYFILE>) {
if (/\Q$files\E$/) {
my @fields = (split)[5,6,7];
$fields = join('',@fields);
last;
}
}
use File::stat;
my $mtime = localtime(stat($files)->mtime);
这将为您提供一个字符串,如Wed Jun 13 11:25:23 2012
。我的ls
输出的日期只包括月份名称、月份的日期和日期的时间,如Jun 8 12:37
。这不是很具体,您可能至少应该包括一年,但是要从这个$mtime
生成相同的字符串,您可以编写
my $fields = join '', (split ' ', $mtime)[1,2,3];
关于你的计划,我还有很多话要说,但我希望这能让你现在开始
我注意到了另外两件事:
- 行
应该是$current\u time=s/\s+//g
,以删除当前时间s中的所有空格$current\u time=~s/\s+//g
sed 's/\(........-..\).*/\1/' - by hours sed 's/\(........\).*/\1/' - by days