目录:
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:等等。 有什么建议来建立这个?或者完全不同的路线也可以。
答案 0 :(得分:4)
使用opendir
和readdir
来阅读目录,使用-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."
}