gpt4 book ai didi

perl - 如何在 File::Find::Rule 的 `or` 替代项中使用 mindepth 和 maxdepth?

转载 作者:行者123 更新时间:2023-12-01 00:15:52 26 4
gpt4 key购买 nike

我有以下文件夹结构(作为一个最小的例子):

dir
├── a
│   ├── b
│   │   ├── c.txt
│   │   └── d.txt
│   └── c
│   └── q.txt
├── b
│   ├── bb.txt
│   └── d
│   └── dd.txt
└── q.txt

我想找到所有 .txt文件,但排除 dir/b 中的所有内容从搜索使用 File::Find::Rule (我知道我可以使用 File::Find 轻松做到这一点,但这需要对我的代码进行大量重构)。

我尝试了以下方法:
use feature qw(say);
use strict;
use warnings;
use File::Find::Rule;

my $dir = 'dir';
my @files = File::Find::Rule->or(
File::Find::Rule->directory->mindepth(1)->maxdepth(1)
->name( 'b' )->prune->discard,
File::Find::Rule->name('*.txt'),
)->in( $dir );
say for @files;

输出 :
dir/q.txt
dir/a/c/q.txt

预期输出 :
dir/q.txt
dir/a/b/d.txt
dir/a/b/c.txt
dir/a/c/q.txt

好像 maxdepth()mindepth()不在 or() 内工作功能。

最佳答案

就像 find命令行工具,maxdepth不限制可以发生匹配的位置;它限制了实际的遍历。

maxdepth( $level )

Descend at most $level (a non-negative integer) levels of directories below the starting point.



就像 find命令行工具, mindepth防止在一定深度之前执行所有测试。

mindepth( $level )

Do not apply any tests at levels less than $level (a non-negative integer).



考虑到它们的作用,它们会影响整个搜索。因此, mindepth 也就不足为奇了。和 maxdepth来自外部规则对象的是使用的对象,而其他对象则被忽略。[1]

适用于 find 的相同解决方案这里可以使用命令行工具。
find :
$ find dir -wholename dir/b -prune -o -name '*.txt' -print
dir/a/b/c.txt
dir/a/b/d.txt
dir/a/c/q.txt
dir/q.txt

文件::查找::规则:
$ perl -MFile::Find::Rule -e'
my ($dir) = @ARGV;
CORE::say for
File::Find::Rule
->or(
File::Find::Rule->exec(sub { $_[2] eq "$dir/b" })->prune->discard,
File::Find::Rule->name("*.txt"),
)
->in($dir);
' dir
dir/q.txt
dir/a/b/c.txt
dir/a/b/d.txt
dir/a/c/q.txt

另一种方法是使用 File::Find::Rule 构建要搜索的目录列表,然后使用 File::Find::Rule 来搜索这些目录。 (Perl 等效于 find ... -print0 | xargs -0 -I{} find {} ... 。)

  • find命令行实用程序以不同的方式处理错位的输入。
    $ find dir -type d -mindepth 1 -maxdepth 1 -name b -prune -o -name '*.txt' -print
    find: warning: you have specified the -mindepth option after a non-option argument (, but options are not positional (-mindepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.

    find: warning: you have specified the -maxdepth option after a non-option argument (, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.

    dir/q.txt
  • 关于perl - 如何在 File::Find::Rule 的 `or` 替代项中使用 mindepth 和 maxdepth?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52672370/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com