开发者

How to check whether a file exists in a particular directory in perl?

How to check whether a particular file exists in a particular directory in perl? Obvious method of checking that absolute directory name is prefix of absolute file name doesn't works as sometime absolute directory name 开发者_高级运维is like /a/b/c/..


File::Find's find function could be used:

Program

#!/usr/bin/env perl                                                                                    

use strict;                                                                                            
use warnings;                                                                                          

use File::Find 'find';                                                                                 


# file 'foo' in path 'a/b/c'
my $file      = 'foo';                                                                                 
my $directory = 'a';                                                                                   

sub check_existance {                                                                              
    if ( -e $_ && $_ eq $file ) {                                                                      
        print "Found file '$_' in directory '$File::Find::dir'\n";                                     
    }                                                                                                  
}                                                                                                      

find( \&check_existance, $directory );

Output

Found file 'foo' in directory 'a/b/c'                                                                  


If you don't know the exact path you could use find2perl. It generates File::Find::find() code for you. To execute the command immediately:

$ find2perl /path/to/dir -name filename.txt -exec echo exists {} | perl

Code generated by find2perl

#! /usr/bin/perl -w
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
        if 0; #$running_under_some_shell

use strict;
use File::Find ();

# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.

# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;
sub doexec ($@);

use Cwd ();
my $cwd = Cwd::cwd();

# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/path/to/dir');
exit;

sub wanted {
    /^filename\.txt\z/s &&
    doexec(0, 'echo','exists','{}');
}

sub doexec ($@) {
    my $ok = shift;
    my @command = @_; # copy so we don't try to s/// aliases to constants
    for my $word (@command)
        { $word =~ s#{}#$name#g }
    if ($ok) {
        my $old = select(STDOUT);
        $| = 1;
        print "@command";
        select($old);
        return 0 unless <STDIN> =~ /^y/;
    }
    chdir $cwd; #sigh
    system @command;
    chdir $File::Find::dir;
    return !$?;
}


if (-e "/path/to/file/filename.txt") {
   print("file exists");
}

?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜