查找给定文件是否存在于目录中

时间:2018-09-20 06:20:02

标签: perl directory file-exists

我想知道文件是否存在于给定目录中。

我需要在临时路径中找到某些.txt文件,但是文件目录需要适合该模式,我需要知道文件是否在给定模式中存在,因为我认为这是最快的方法查找文件,如果我尝试使用A下的Find :: File以普通方式查找,则唯一的“不确定”或“。*”路径位于a / b / c / d / e /和dou / you / 1.txt之间父目录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/hk/l/mz/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 :(得分:2)

var query = new Sql().Select("*").From(TableConstants.Questions.TableName) .Where(string.Format(" CommunityId in ({0})", string.Join(",", communtiyList.Select(x => x.Id)).Split(',')));正确地报告说,没有文件的路径为-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;
}

答案 1 :(得分:2)

听起来您需要 File::Globstar模块。它实现了与外壳 globstar 扩展名等效的功能,该扩展名将允许模式中的两个星号func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { guard range.location == 0 else { return true } let newString = (textView.text as NSString).replacingCharacters(in: range, with: text) as NSString return newString.rangeOfCharacter(from: CharacterSet.whitespacesAndNewlines).location != 0 } 匹配任何字符串,包括路径分隔符

可能看起来像这样

**