Как и в случае инструмента командной строки find
, maxdepth
не ограничивает место совпадения;он ограничивает фактический обход.
maxdepth( $level )
Спуск по максимуму $level
(неотрицательное целое) уровней каталогов ниже начальной точки.
Как и инструмент командной строки find
, mindepth
предотвращает выполнение всех тестов до определенной глубины.
mindepth( $level )
Не применяетсялюбые тесты на уровнях меньше $level
(неотрицательное целое число).
Учитывая, что они делают, они влияют на весь поиск.Поэтому неудивительно, что 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
File :: Find :: Rule:
$ 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