如何在Perl中确定文件

时间:2010-06-16 08:08:56

标签: linux perl

我使用File :: Find - > find(\& f,$ directory)查找包含某些内容的文件。 我的代表的相关部分如下:

sub f {
  my $file = $File::Find::name;
  return unless -f $file;
  return unless $file =~ /$file_pattern/;

  etc...

但问题是,每次当前目录中不存在$ file时,此代码都会返回。 例如对于文件./test它很好,但对于文件./dir/test这个返回...

有没有更好的方法来了解$ file是否是文件?

3 个答案:

答案 0 :(得分:7)

这一行

return unless -f $file;
如果$ file不是文件(可能是文件夹),

将返回

这一行

return unless $file =~ /$file_pattern/;
如果文件名称不包含$ file_pattern,

将返回。

请注意,根据文档,此子f()不会告诉File :: Find要查找哪些文件...

  

want()函数可以做任何事情   您希望在每个文件上进行验证   和目录。请注意,尽管如此   name,want()函数是一个   通用回调函数,并做   不告诉File ::查找文件是否   “通缉”与否。事实上,它的回归   值被忽略。

要查找文件夹中的所有文件,您可能会更容易使用File::Find::Rule。以下是文档中的示例...

  my @files = File::Find::Rule->file()
                              ->name( '*.pm' )
                              ->in( @INC );

答案 1 :(得分:0)

如何使用

进行检查
if (! -f $file) { 
   die "not a file";
}

答案 2 :(得分:-1)

谢谢大家的重播,但你错了:) 这是一些错误。它只适用于完整路径。 我进行了一些测试。这是代码:

#!/usr/bin/perl

use strict;
use File::Find;
use Cwd;

print "++ With relative path ++\n";
find(\&f, ".");

print "\n++ With current working directory module ++\n";
find(\&f, cwd);

sub f
{
        my $file = $File::Find::name;
        print $file . ":\n";

        if (-f $file) { print "---- ist Datai\n"; }
        else { print "---- ist nicht eine Datei!!!\n"; }
}

以下是命令:

[andrey @ andreys-comp testdir] $ ls -l innerdir /
共4 -rw-rw-r-- 1 andrey andrey 0 Jun 18 22:02 innertestfile
[andrey @ andreys-comp testdir] $ ./test.pl
++使用相对路径++

---- ist nicht eine Datei !!!
./test.pl:
---- ist Datai
./testfile:
---- ist Datai
./innerdir:
---- ist nicht eine Datei !!!
./innerdir/innertestfile:
---- ist nicht eine Datei !!!

++使用当前工作目录模块++
/家庭/安德烈/ TESTDIR:
---- ist nicht eine Datei !!!
/home/andrey/testdir/test.pl:
---- ist Datai
/家庭/安德烈/ TESTDIR / testfile的:
---- ist Datai
/家庭/安德烈/ TESTDIR / innerdir:
---- ist nicht eine Datei !!!
/家庭/安德烈/ TESTDIR / innerdir / innertestfile:
---- ist Datai

ist Datei:是档案
ist nicht eine Datei:不是文件(我只是喜欢德语:))

请注意,第一种方法./innerdir/innertestfile未确定为文件,而不是第二种方法。