Perl:如何在目录中搜索文件类型,按修改日期排序

时间:2015-02-12 01:29:23

标签: perl sorting search

目录:

C:/test
C:/test/A1/apples.txt    Modified 1-12-2013
C:/test/B1/oranges.txt   Modified 1-12-2014
C:/test/C1/bananas.txt   Modified 1-12-2015

将根目录(C:/ test)提供给perl脚本,它将找到最近修改过的目录和文件。

perl findfile.pl C:/test
Answer: C:/test/C1/bananas.txt

我需要这个脚本才能在我无法控制的多台计算机上工作,所以我无法安装" File :: Find"或任何其他图书馆。

我尝试了使用windows命令dir的路线:

my @txt_files = `dir C:/test /O:-D /s *.txt`;
foreach my $line (@txt_files)
{
    if($line =~ /\s+Directory of (\S+)/)
    {
        print "$1\n"; # gets the directory
    }
...
}

如果从不同的驱动器运行此脚本,Z:X:等等。 有什么建议来建立这个?或者完全不同的路线也可以。

1 个答案:

答案 0 :(得分:4)

使用opendirreaddir来阅读目录,使用-X(检查perldoc -f -X)检查上次修改日期,如果是文件或目录,请使用regexp找到.txt文件。维护一个已找到目录的队列,然后运行一个while循环,从中取出元素,直到它为空。

use strict;
use warnings;

unless ($ARGV[0]) { die "No starting directory specified" }
my @dir_queue = $ARGV[0];
my $most_recent_name;
my $most_recent_time;

while (@dir_queue) {
    my $current_dir = shift(@dir_queue);
    unless (opendir(my $current_dir_dh, $current_dir)) {
        die "Can't open directory $current_dir: $!"
    } else {
        while (my $entry = readdir($current_dir_dh)) {
            if ($entry eq '.' or $entry eq '..') { next }
            my $entry_full_name = "$current_dir/$entry";
            if (-d $entry_full_name) { push @dir_queue, $entry_full_name; next }
            unless ($entry =~ /\.txt$/i) { next }
            if (!$most_recent_time or ($most_recent_time > -M $entry_full_name)) {
                $most_recent_time = -M $entry_full_name;
                $most_recent_name = $entry_full_name;
            }
        }
    }
}

if (defined $most_recent_name) {
    print "Most recently modified: $most_recent_name"
} else {
    print "No files found."
}