App-finddo

 view release on metacpan or  search on metacpan

lib/App/finddo.pm  view on Meta::CPAN

_
    args => {
        command => {
            schema => ['array*', of=>'str*'],
            pos => 0,
            greedy => 1,
        },

        exists => {
            schema => 'bool*',
        },

        files => {
            schema => 'bool*',
            cmdline_aliases => {
                f => {summary => 'Shortcut for --files'   , code=>sub {$_[0]{files} = 1}},
                F => {summary => 'Shortcut for --no-files', code=>sub {$_[0]{files} = 0}},
            },
        },
        dirs => {
            schema => 'bool*',
            cmdline_aliases => {
                d => {summary => 'Shortcut for --dirs'   , code=>sub {$_[0]{dirs} = 1}},
                D => {summary => 'Shortcut for --no-dirs', code=>sub {$_[0]{dirs} = 0}},
            },
        },

        smallest => {
            schema => 'bool*',
        },
        largest => {
            schema => 'bool*',
        },
        oldest => {
            schema => 'bool*',
        },
        newest => {
            schema => 'bool*',
        },
        sort => {
            schema => ['str*', in=>[qw/mtime -mtime size -size name -name/]],
        },

        max_result => {
            schema => 'int*',
            cmdline_aliases => {n=>{}},
        },

        media => {
            schema => 'bool*',
        },
        audio => {
            schema => 'bool*',
        },
        video => {
            schema => 'bool*',
        },
        image => {
            schema => 'bool*',
        },
        # XXX add arg: doc/ebook, backup, compressed, archive

        # XXX add arg: recursive (-r)
        # XXX add arg: max_depth
        # XXX add arg: (mtime, ctime) (min, max)
        # XXX add arg: size (min, max)
    },
    args_rels => {
        'choose_one&' => [
            [qw/sort newest oldest smallest largest/],
            [qw/files dirs/],
            [qw/media audio video image/],
        ],
    },
    result_naked => 1,
    links => [
        {url=>'prog:find', summary => 'Unix command'},
    ],
};
sub finddo {
    my %args = @_;

    my $max_result = $args{max_result};
    if ($args{newest} || $args{oldest} || $args{largest} || $args{smallest}) {
        $max_result = 1 unless defined $max_result;
    }
    $max_result = -1 unless defined $max_result;

    my $re_ext;
    my $ext_cond;
    if (defined $args{media}) {
        $ext_cond = $args{media};
        $re_ext = _get_ext_re_from_mime_types_file(qr!^(?:audio|video|image)/!);
    } elsif (defined $args{audio}) {
        $ext_cond = $args{audio};
        $re_ext = _get_ext_re_from_mime_types_file(qr!^(?:audio)/!);
    } elsif (defined $args{video}) {
        $ext_cond = $args{video};
        $re_ext = _get_ext_re_from_mime_types_file(qr!^(?:video)/!);
    } elsif (defined $args{image}) {
        $ext_cond = $args{image};
        $re_ext = _get_ext_re_from_mime_types_file(qr!^(?:image)/!);
    }

    my @res;
  FIND:
    {
        opendir my $dh, "." or do {
            warn "finddo: Can't opendir: $!\n";
            last FIND;
        };
        my @entries = readdir $dh;
        closedir $dh;

      ENTRY:
        for my $entry (@entries) {
            next if $entry eq '.' || $entry eq '..';
            my @lst = lstat $entry;
            my @st  = $lst[2] & S_IFLNK ? stat($entry) : @lst;

            if (defined $args{exists}) {



( run in 0.891 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )