если я использую приведенный ниже код в Windows, я получаю временные метки всех файлов, которые находятся в папках даже вне моей папки
Я подозреваю, что проблема могла быть связана с каталогами .
и ..
, которые, если бы вы попытались следовать им, взяли бы вас вверх дерево каталогов. То, что вам не хватало, было:
foreach my $file (@files) {
# skip . and .. which cause recursion and moving up the tree
next if $file =~ /^\.\.?$/;
...
Ваш скрипт также страдает от пары ошибок. $file
не относится к $dir
, поэтому -d $file
будет работать только в текущем каталоге, а не ниже.
Вот моя исправленная версия:
use warnings;
use strict;
# if unix, change to "/";
my $FILE_PATH_SLASH = "\\";
my @dirs = (".");
my %seen;
while (my $dir = shift @dirs) {
opendir(DIR, $dir) or die "Cannot open $dir\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
# skip . and ..
next if $file =~ /^\.\.?$/;
my $path = "$dir$FILE_PATH_SLASH$file";
if (-d $path) {
next if $seen{$path};
$seen{$path} = 1;
push @dirs, $path;
}
next unless $path ~= /\.txt$/i;
my $mtime = (stat($path))[9];
print "$path $mtime\n";
}
}