Найти, существуют ли данные файлы в каталоге - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу знать, существует ли файл в указанном каталоге.

Мне нужно найти определенные файлы .txt во временном каталоге, но каталог файлов должен соответствовать шаблону, мне нужночтобы узнать, существуют ли файлы в данном шаблоне, так как я думаю, что это самый быстрый способ найти файл, единственный путь «неопределенный» или «. *» находится между a / b / c / d / e / и dou/you/1.txt, если я попытаюсь найти с помощью обычного поиска Find :: File в родительском каталоге a / b / c / d / e /, это займет около 10 минут, и есть вероятность, что я сохранил нежелательный путьв массиве причина 1.txt также существует в подкаталогах.

например, Требуются конкретные каталоги

a/b/c/d/e/f/g/h/dou/you/1.txt
a/b/c/d/e/k/l/m/dou/you/1.txt

a/b/c/d/e/k/l/m/wanna/play/2.txt
a/b/c/d/e/z/x/c/wanna/play/2.txt

a/b/c/d/e/f/g/h/with/me/3.txt
a/b/c/d/e/z/x/c/with/me/3.txt

Perl

use strict;
use warnings;

my @temporaryPath = qw(
    dou/you/1.txt
    wanna/play/2.txt
    with/me/3.txt
    like/play/4.txt
    anything/really/5.txt
);

foreach my $temporaryList ( @temporaryPath ) {

    my $dir = "a/b/c/d/e/" . "*" . "/$temporaryList";

    if ( -e $dir ) {
        print " exist :) $temporaryList\n";
    }
    else {
        print " not exist :( $temporaryList\n";
    }
}

Я использовал .* в $dir потому что существует много разных каталогов между полными путями, например f/g/h, k/l/m или z/x/c.

В результате это

not exist :( dou/you/1.txt
not exist :( wanna/play/2.txt
not exist :( with/me/3.txt
not exist :( like/play/4.txt
not exist :( anything/really/5.txt

означаетчто $dir не может прочитать a/b/c/d/e/.*/

Есть ли способ?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Похоже, вам нужен модуль File::Globstar.Он реализует эквивалент расширения оболочки globstar , которое позволит двум звездочкам ** в шаблоне соответствовать любой строке, включая разделители пути

. Это может выглядеть так

use strict;
use warnings 'all';
use feature 'say';

use File::Globstar 'globstar';

my @paths = qw{
    dou/you/1.txt
    wanna/play/2.txt
    with/me/3.txt
    like/play/4.txt
    anything/really/5.txt
};

for my $path ( @paths ) {

    say for globstar "a/b/c/d/e/**/$path;
}
0 голосов
/ 20 сентября 2018

-e правильно сообщает, что нет файла с путем a/b/c/d/e/*/dou/you/1.txt, потому что нет каталога с именем * в a/b/c/d/e.

use File::Find::Rule qw( );

my @targets = qw(
    dou/you/1.txt
    wanna/play/2.txt
    with/me/3.txt
    like/play/4.txt
    anything/really/5.txt
);

my $base_dir_qfn = 'a/b/c/d/e';

my @files = File::Find::Rule->file->in($base_dir_qfn);

my $target_pat = join '|', map quotemeta, @targets;
my $target_re = qr{/(?:$target_pat)\z};

for my $file (@files) {
   say $file if $file =~ $target_re;
}

Тест:

$ mkdir -p a/b/c/d/e/f/g/h/dou/you;    touch a/b/c/d/e/f/g/h/dou/you/1.txt
$ mkdir -p a/b/c/d/e/k/l/m/dou/you;    touch a/b/c/d/e/k/l/m/dou/you/1.txt
$ mkdir -p a/b/c/d/e/k/l/m/wanna/play; touch a/b/c/d/e/k/l/m/wanna/play/2.txt
$ mkdir -p a/b/c/d/e/z/x/c/wanna/play; touch a/b/c/d/e/z/x/c/wanna/play/2.txt
$ mkdir -p a/b/c/d/e/f/g/h/with/me;    touch a/b/c/d/e/f/g/h/with/me/3.txt
$ mkdir -p a/b/c/d/e/z/x/c/with/me;    touch a/b/c/d/e/z/x/c/with/me/3.txt
$ perl a.pl
a/b/c/d/e/f/g/h/dou/you/1.txt
a/b/c/d/e/f/g/h/with/me/3.txt
a/b/c/d/e/k/l/m/dou/you/1.txt
a/b/c/d/e/k/l/m/wanna/play/2.txt
a/b/c/d/e/z/x/c/wanna/play/2.txt
a/b/c/d/e/z/x/c/with/me/3.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...