Perl:查找超过X分钟的文件的最快方法,按最早到最新排序
我试图检查是否有一个文件(我不关心文件夹)超过X分钟。不幸的是,我可以;我不知道这段代码的错误在哪里。 我将感谢任何帮助:) 1。查找早于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
#!/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;