2015-08-07 2 views
1

У меня есть скрипт, который заполняет имена файлов и время последнего изменения соответствующего файла в определенном каталоге. Я использовал модуль DosGlob для указания регулярного выражения.Perl DosGlob не работает после первой оценки

структура каталогов Образец:
//share16/ABC/X/Output/1/
//share16/ABC/X/Output/2/
//share16/ABC/Y/Output/1/
//share16/ABC/Y/Output/2/

Ниже приведен код, который делает выше и дополнительно код после этого, который выходит из настоящего контекста.

use File::DosGlob 'glob'; 
my @dir_regex = glob "//share16/ABC/*/Output/"; 
for my $dir (@dir_regex) { 
    find({ wanted => \&process_file, no_chdir => 1 }, $dir) or die $!; 
} 

sub process_file { 
    my $dummy = $_; 
    if (-f $dummy) { 
     my $filename = "//share16/TOOLS/report.txt"; 
     open(my $fh, '>>', $filename) 
      or die "Could not open file '$filename' $!"; 
     my $last_mod_time = ctime(stat($dummy)->mtime); 
     print $fh "$last_mod_time $dummy\n"; 
    } 
    close $fh; 
} 

Сценарий успешно не перечисляет вниз файлы под все папки (папки 1, папка 2) под первой директории X, но не сразу, когда он начинает читать папке Y.

Ошибка: Нет такого файла или каталог в \ share16 \ traverse4.pl строка 5.

Я не знаю, почему он терпит неудачу, поскольку я пробовал hardcoding имя_папки в dir_regex, но он все еще не удается после перечисления файлов в первом каталоге.

+0

Если вы обновили информацию, пожалуйста, внесите ее в свой вопрос. – Sobrique

+0

Сделано! Спасибо Sobrique за указание –

ответ

2

Потому что вы установили no_chdir так find не chdir. Таким образом, ваши различные вызовы - с относительным путем - терпят неудачу. Простое решение будет использовать $File::Find::name вместо $_

Я бы также отметить, - вы можете просто указать список каталогов для File::Find - вам не нужно делать каждый в отдельности.

Смежные вопросы