use strict; use warnings; use Smart::Comments; use List::MoreUtils qw(any); use File::Spec; my @RE_IGNORED = do { open my $fh, '<', 'IGNORE' or die $!; map { s/\./\\./g; s/\+/\\+/g; s/\?/.?/g; s/\*/.*?/g; qr/^$_$/; } grep {length} map {s/^\s*#//; $_} map {tr/\n//d; $_} <$fh>; }; main(); sub main { my @current = find($ENV{HOME}, '.', sub {$_[0] =~ m/^\./}); foreach (@current) { print "$_\n"; } } sub find { my $base = shift; my $dir = shift || '.'; my $sel = shift || sub {1}; my $dirpath = File::Spec->catfile($base, $dir); opendir my $dh, $dirpath or die "opendir: $dirpath: $!"; my @d; while (my $name = readdir $dh) { next if $name =~ /^\.\.?$/; next if !$sel->($name); my $abs = File::Spec->rel2abs($name, $dirpath); my $rel = File::Spec->abs2rel($abs, $base); next if any { $rel =~ m/$_/ } @RE_IGNORED; next if !-e $abs; if (-d $abs) { push @d, find($base, $rel); } else { push @d, $rel; } } @d; }