Perl:打开和阅读目录&使用grep过滤结果

时间:2014-05-08 06:53:51

标签: perl grep

我正在尝试删除超过x天的文件,并在perlmonks Find files older than x days and delete them上访问此页面。以下是执行相同操作的代码(据我所知,它会从DIR中删除超过14天的文件):

#! /usr/local/bin/perl
my $path = '../some/hardcoded/dir/here';
die unless chdir $path;
die unless opendir DIR, ".";
foreach $file (grep {-f && (14 < -M)} readdir DIR) {
        print $file;
        #unlink $file;
}
closedir DIR;

但我不想更改目录(chdir),因此更改了下面的代码,但它不是打印文件名

die unless opendir DIR, $path;
foreach $file (grep {-f && (14 < -M)} readdir DIR) {
       print $file;
       #unlink $file;
}
closedir DIR;

即使这是正确打印文件。

die unless opendir DIR, $path;
foreach $file (readdir DIR) {
       print $file;
       #unlink $file;
}
closedir DIR;

我试图搜索答案,但无法清楚地解决问题。请解释如何使用grep并获取当前目录文件而不更改目录(chdir)。

修改print Dumper map [$_, -f, -M], readdir DIR;

的输出
$VAR1 = [
          'PRTS_5_Thu_May_8_11-47-19_2014.pdf',
          undef,
          undef
        ];
$VAR2 = [
          '.',
          '',
          '0.0891203703703704'
        ];
$VAR3 = [
          'PRTS_49_Thu_May_8_12-31-11_2014.pdf',
          undef,
          undef
        ];
$VAR4 = [
          'PRTS_34_Thu_May_8_12-27-03_2014.pdf',
          undef,
          undef
        ];
$VAR5 = [
          '..',
          '',
          '9.02722222222222'
        ];

编辑2:       当我将$路径从'../some/hardcoded/dir/here'更改为'。'时。我正确地获取文件。

1 个答案:

答案 0 :(得分:2)

您可以使用touch(测试)更改linux文件的日期。我认为你的问题是readdir只返回文件名,而不是文件的完整路径。

您可以通过这种方式测试代码(更长但更容易理解):

#! /usr/local/bin/perl
use strict;
use warnings;

my $dir = "/some/hardcoded/dir/here";
die unless opendir DIR, $dir;
foreach my $file (readdir DIR) {
   next if $file eq '.' or $file eq '..';
   $file = $dir.'/'.$file;
   print "found $file, mtime: ".(-M $file)."\n";
   if (-f $file && (14 < -M)){
     print "unlinking $file\n";
   }
}
closedir DIR;