Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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:查找超过X分钟的文件的最快方法,按最早到最新排序_Perl_File_Sorting_Find - Fatal编程技术网

Perl:查找超过X分钟的文件的最快方法,按最早到最新排序

Perl:查找超过X分钟的文件的最快方法,按最早到最新排序,perl,file,sorting,find,Perl,File,Sorting,Find,我试图检查是否有一个文件(我不关心文件夹)超过X分钟。不幸的是,我可以;我不知道这段代码的错误在哪里。 我将感谢任何帮助:) 1。查找早于X分钟数的文件 #!/usr/bin/perl my $maindir = "C:\\Users\\Dor\\Desktop\\aba"; my $minutesold = 60; my $now = time; my $filedisc; # Declare arrays my @xmlfiles; my @qulfiedfiles; # Decl

我试图检查是否有一个文件(我不关心文件夹)超过X分钟。不幸的是,我可以;我不知道这段代码的错误在哪里。 我将感谢任何帮助:)

1。查找早于X分钟数的文件

#!/usr/bin/perl 

my $maindir = "C:\\Users\\Dor\\Desktop\\aba";
my $minutesold = 60;
my $now = time;
my $filedisc;

# Declare arrays
my @xmlfiles;
my @qulfiedfiles; 

# Declare a Dictionary
my %filedisc;

opendir(my $dh, $maindir) or die "opendir($maindir): $!";

 # Read all the files
 while (my $de = readdir($dh)) 
 {
    # get the Full path of the file
    my $f = $maindir . $de;

    if ( -f $f )
    {

        push (@xmlfiles, $f); 

    }
}
    closedir($dh);


 # For every file in directory
 for my $file (@xmlfiles) {

    # Get stats about a file
    my @stats = stat($file);

    # If time stamp is older than minutes provided
    if ($stats[9] >= ($now - (( $minutesold * 60) ))){

       # Put the File and Time stamp in the dictionary
       print($stats[9] ."          .|           "  .$file ."\n\n");

    }

    #print($now ."\n")
    #print($now - ( $minutesold * 60) ."\n"); 
 }

您错过了一种获取perl中文件修改时间的简单方法-M开关

    my $modifiedTimeinDays = -M "$file";

    my $modifiedTimeinSec = $modifiedTimeinDays*60*60*24;

    if($modifiedTimeinSec > 60)
    {
       # file older than 60 sec
    }
就这么简单


请参阅以了解所有文件测试。

路径和文件不正确

my $f = $maindir . $de;
应为(在路径和文件之间添加斜杠)


通常最好使用
glob
而不是
opendir
/
readdir
,以避免为每个结果“重建”文件的完整路径

您可能希望在Windows上启用
:bsd_glob
选项,以便正确处理带有空格的路径,例如
C:\Program Files

use strict;
use warnings 'all';

use File::Glob ':bsd_glob'; # Provide for spaces in path

my $root       = 'C:\Users\Dor\Desktop\aba';
my $minutesold = 60;

my @old_files = grep { -f and -M * 24 * 60 > $minutes_old } glob "$root\\*.*";

以函数式编程的方式解决这个问题,我认为:

my $dir = shift() || $ENV{HOME}; #command line arg or else home dir
my $minutesold = 60; #1h                                                                                                                                                                                            
opendir my $dh, $dir or die "ERR: opendir($dir) $!\n";

print
map     "$$_{timestamp}          .|            $$_{file}\n",
#sort   { $$a{timestamp} <=> $$b{timestamp} }  # sort by age
#sort   { $$a{file}      cmp $$b{file}      }  # sort by name
grep    $^T-$$_{timestamp} >= 60*$minutesold,  # $^T is program startup time()
map     {{timestamp=>(stat($_))[9], file=>$_}}
grep    -f $_,
map     "$dir/$_",
readdir $dh;

closedir $dh;
my$dir=shift()| |$ENV{HOME}#命令行arg或else home dir
我的$minutesold=60#1h
opendir my$dh、$dir或die“ERR:opendir($dir)$!\n”;
打印
映射“$${timestamp}.$$${file}\n”,
#排序{$$a{timestamp}$$b{timestamp}}按年龄排序
#排序{$$a{file}cmp$$b{file}}#按名称排序
grep$^T-$${timestamp}>=60*$minutesold,#$^T是程序启动时间()
映射{{timestamp=>(stat($)[9],file=>$}
grep-f$,
映射“$dir/$\”,
readdir$dh;
约$dh;

运行时出现了什么问题?您是否查看了@xmlfiles并验证了添加了正确的文件名?像
#Declare array
这样的东西太荒谬了。如果您看不到接下来的几行代码在做什么,那么您就不可能理解代码、注释或其他内容。仅仅为了代码而在代码中添加注释已经过时二十多年了,最好使用合理的标识符来表达您的想法。只有当代码晦涩难懂或不规范(可能是由于优化)或不清楚代码的原因时,才需要注释。这两种方法都不适用于本代码中的任何注释,因此它们只会使其变得模糊<代码>#读取所有文件完全错误。我得到一个空白输出。我在文件夹中的一个文件中尝试了它:
#/usr/bin/perl my$maindir=“C:\\Users\\Dor\\Desktop\\aba\\a.txt”;我的$filename=“a.txt”;my$age=-M$maindir;打印$age
@lol Add
使用警告
使用严格到脚本的顶部。它将告诉您
$age
是否未定义,这可能意味着文件不存在。Re“这可能意味着文件不存在”,确切的错误将在
$中找到您需要自己“查看perldoc-f-X以了解所有文件测试”
-M
返回文件的时间(在Perl程序启动时)以天为单位。请更加小心地发布准确的信息。想象你正在编辑一个维基百科页面通常会有所帮助。@SrihariKaranth:通过胡乱猜测进行编程很少有成效,而且很可能会产生错误代码。将字符串变量括在双引号中通常是错误的,并且您的程序在Windows上可以正常工作,除了
-M
返回我已经编写的文件的使用期限(以天为单位)。这是我得到的输出:参数“main::24”在C:\Users\Dor\Desktop\folderTest.pl第27行的乘法()中不是数字。
my $dir = shift() || $ENV{HOME}; #command line arg or else home dir
my $minutesold = 60; #1h                                                                                                                                                                                            
opendir my $dh, $dir or die "ERR: opendir($dir) $!\n";

print
map     "$$_{timestamp}          .|            $$_{file}\n",
#sort   { $$a{timestamp} <=> $$b{timestamp} }  # sort by age
#sort   { $$a{file}      cmp $$b{file}      }  # sort by name
grep    $^T-$$_{timestamp} >= 60*$minutesold,  # $^T is program startup time()
map     {{timestamp=>(stat($_))[9], file=>$_}}
grep    -f $_,
map     "$dir/$_",
readdir $dh;

closedir $dh;