File ::在Perl中查找 - 仅查找文件

时间:2016-06-06 14:28:00

标签: perl

我有一个这样的脚本列出我的根路径中的每个文件

use strict;
use File::Find qw(find);
my $path = "<my root path>";

find(\&Search, $path);

sub Search{
    my $filename = $File::Find::name;
    if(-f $filename){
        print $filename."\n";
    }   
}

我的意思是尝试列出所有文件。但是,它还在我的$ root中列出了符号链接。我像这样修改我的搜索功能,它起作用了:

sub Search{
    my $filename = $File::Find::name;
    #Check if $filename is not symlink first
    if(!-l $filename){
        if(-f $filename){
            print $filename."\n";
        }  
    }   
}

但它看起来很尴尬吧?为什么我们需要两个if if来验证$ filename是真实文件而不是符号链接!!!

有人可以为此建议一个更好,更体面的解决方案吗?

谢谢你,并致以最诚挚的问候。

Alex

2 个答案:

答案 0 :(得分:2)

-f正在测试文件,而包含符号链接。所以,是的,你必须测试两者。

一个有用的东西,就是你可以这样做:

if ( -f and not -l ) { 

因为File::Find$_设置为当前文件,file test默认使用该文件。 (如果打开no_chdir,则无效)。

您可能还想将File::Find::Rule视为File::Find的替代方案。

答案 1 :(得分:2)

除了符号链接外,

statlstat完全相同。前者收集有关链接文件的信息,而后者收集有关链接本身的信息。

u'La Pocati\xe8re.png' 使用cd /home/try/.ssh/ mv try id_rsa mv try.pub id_rsa.pub 。这里需要-X EXPR

stat

奖励:预先调用lstatsub Search { my $filename = $File::Find::name; if (!lstat($filename)) { warn("Can't stat $filename: $!\n"); return; } say $filename if -f _; } 时,错误检查会变得更加简单。