Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
Linux perl while循环_Linux_Perl - Fatal编程技术网

Linux perl while循环

Linux perl while循环,linux,perl,Linux,Perl,在这段代码中,我解析了日志文件修改日期的文件(包含ls-lrt的输出)。然后,我将所有日志文件移动到一个新文件夹中,并将其修改日期添加到文件名中,然后对所有这些文件进行tar 我遇到的问题是while循环。因为它正在读取所有文件的数据,while循环持续运行15次。我理解代码中存在一些问题,但我无法理解 在while循环中,我正在拆分ls-lrt记录以查找日志文件修改日期$file是ls命令的输出,我将其存储在文本文件/scripts/yagya.txt中以获取修改日期。但是while循环执行了

在这段代码中,我解析了日志文件修改日期的文件(包含ls-lrt的输出)。然后,我将所有日志文件移动到一个新文件夹中,并将其修改日期添加到文件名中,然后对所有这些文件进行tar

我遇到的问题是
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
        应该是
        $current\u time=~s/\s+//g
        ,以删除当前时间s中的所有空格
        sed 's/\(........-..\).*/\1/'  - by hours
        sed 's/\(........\).*/\1/' - by days