我正在尝试删除超过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'更改为'。'时。我正确地获取文件。
答案 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;