Исключить конкретный каталог в Perl - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу написать код для чтения всех файлов, присутствующих в каталоге, кроме определенного каталога.

Путь к каталогу:

constellation/netcool/aws_netcool_db2/trunk/src

В разделе src имеется 3 каталога (base, v1_version, v2_version, v3_version).Я хочу прочитать все каталоги, кроме каталога base.

Как мне решить эту проблему?

1 Ответ

1 голос
/ 18 апреля 2019

Использование find:

quotemeta() { printf '%s' "$1" | perl -0777ne'print quotemeta($_)'; }

path=constellation/netcool/aws_netcool_db2/trunk/src

find "$path" \
   -path "$( quotemeta "$path/base" )" \
   -prune \
-o \
   \! -type d \
   -print

Обратите внимание, что это не работает для путей, начинающихся с -.Добавьте к этим ./.


Использование Perl:

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

my $path = "constellation/netcool/aws_netcool_db2/trunk/src";

my $FFR = File::Find::Rule::;
my @files =
   $FFR->or(
      $FFR
         ->exec(sub{ $_[2] eq "$path/base" })
         ->prune
         ->discard,
      $FFR
         ->not( $FFR->directory ),
   )
      ->in($path);

Обратите внимание, что это не работает для всех путей (например, ., тех, которые заканчиваются на / и т. д.), поскольку F :: F :: R очищает пути.Вам потребуется применить те же недокументированные очистки к значению, с которым сравнивается $_[2], если вы хотите поддерживать произвольные пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...