2013-03-08 1 views
3

У меня есть сегмент кода, который работает, который находит все .txt-файлы в заданной директории, но я не могу заставить его искать в подкаталогах.Perl находит файл, основанный на его расширении, через все подкаталоги

мне нужен мой сценарий, чтобы сделать две вещи

  1. сканирования через папку и все его подкаталоги для текстового файла
  2. Распечатайте только последние сегменты пути

Для Например, у меня есть каталог, структурированный

C:\abc\def\ghi\jkl\mnop.txt 

Сценарий, который указывает на pa th C:\abc\def\. Затем он проходит через каждую из подпапок и находит mnop.txt и любой другой текстовый файл, находящийся в этой папке.

Затем печатает ghi\jkl\mnop.txt

Я использую это, но это действительно только печатает имя файла и, если файл находится в настоящее время в этой папке.

opendir(Dir, $location) or die "Failure Will Robertson!"; 
@reports = grep(/\.txt$/,readdir(Dir)); 
foreach $reports(@reports) 
{ 
    my $files = "$location/$reports"; 
    open (res,$files) or die "could not open $files"; 
    print "$files\n"; 
} 
+0

является '$ location' должным образом заполненным населением? –

+0

Да, я заполняю его выше в коде (не показан) – Heuristic

+0

Если его предполагается переписывать через поддиректории, вероятно, сработает запись рекурсивной подпрограммы. – mzedeler

ответ

6

Как насчет использования File::Find?

#!/usr/bin/env perl 

use warnings; 
use strict; 
use File::Find; 

# for example let location be tmp 
my $location="tmp"; 

sub find_txt { 
    my $F = $File::Find::name; 

    if ($F =~ /txt$/) { 
     print "$F\n"; 
    } 
} 


find({ wanted => \&find_txt, no_chdir=>1}, $location); 
+0

Это именно то, что я хочу. Могу ли я сделать foreach в поиске? В основном для каждой вещи, которую он находит, сделать это? – Heuristic

+0

nevermind, я просто добавляю его в исходное предложение if. – Heuristic

2

Намного проще, если вы просто использовать File::Find модуль ядра:

#!/usr/bin/perl 
use strict; 
use warnings FATAL => qw(all); 

use File::Find; 

my $Target = shift; 

find(\&survey, @ARGV); 

sub survey { 
    print "Found $File::Find::name\n" if ($_ eq $Target) 
} 

Первый аргумент: непроторенный имя файла для поиска. Все последующие аргументы - это каталоги для проверки. Файл :: Найти поиск рекурсивно, поэтому вам нужно только назвать вершину дерева, все подкаталоги также будут автоматически найдены.

$File::Find::name - полное имя файла, поэтому вы можете вычесть из него $location, если хотите относительный путь.

+0

Итак, у меня есть путь, который выглядит так: C: \ views \ servername \ reports \ universees \ Project Что такое регулярное выражение, чтобы заставить его просто сказать \ reports \ universes \ project? Thanks – Heuristic

+0

nevermind = ~ s: (. *) (\/Reports \ /.*): $ 2 :; – Heuristic

1

Я действительно считаю, что это решение более простое и удобное для чтения. Надеюсь, это полезно!

#!/usr/bin/perl 

use File::Find::Rule; 

my @files = File::Find::Rule->file() 
          ->name('*.txt') 
          ->in('/path/to/my/folder/'); 

for my $file (@files) { 
    print "file: $file\n"; 
} 
Смежные вопросы