Как найти подкаталоги используя find - PullRequest
0 голосов
/ 19 ноября 2018

Я использую эту команду ниже, чтобы получить подкаталоги внутри массива @handoff perl-кода.

chomp(@handoff = `find * -maxdepth 0 -type d -name "18????_????" | sort -u | tail -2`);

Я получаю ошибку как

find: unknown predicate `-lrt'

Если я попробую ту же команду в терминале напрямую, я смогу получить подкаталоги. Пожалуйста, предложите мне какое-нибудь решение.

Ответы [ 2 ]

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

find ожидает путь для поиска в качестве первого аргумента, следовательно:

    find * -maxdepth 0 -type d -name "18????_????" | sort -u | tail -2

должно быть:

    find . -maxdepth 1 -type d -name "18????_????" | sort -u | tail -2

(при условии, что вы хотите найти текущий путь - иначе замените. с путем поиска).

Но суть в том, что вы уже используете perl, зачем использовать внешнюю команду, такую ​​как find?

Вот еще одно решение с использованием модуля Path :: Iterator :: Rule .

use Path::Iterator::Rule;
my @handoffs = Path::Iterator::Rule
    ->new
    ->directory             # only directories (not files)
    ->max_depth(1)          # do not recurse
    ->name("18????_????")   # match directory name (glob or regex)
    ->all(".")              # search the current path
;
0 голосов
/ 19 ноября 2018

Нет необходимости вызывать внешнюю программу для поиска подкаталогов:

opendir(my $dh, '.') || die "Can't opendir '.': $!";
my @handoff = grep { /^18.{4}_.{4}$/ && -d $_ } readdir($dh);
closedir $dh;
print join(' ', @handoff), "\n"
...