我有一个这样的脚本列出我的根路径中的每个文件
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
答案 0 :(得分:2)
-f
正在测试文件,而包含符号链接。所以,是的,你必须测试两者。
一个有用的东西,就是你可以这样做:
if ( -f and not -l ) {
因为File::Find
将$_
设置为当前文件,file test默认使用该文件。 (如果打开no_chdir
,则无效)。
您可能还想将File::Find::Rule
视为File::Find
的替代方案。
答案 1 :(得分:2)
stat
和lstat
完全相同。前者收集有关链接文件的信息,而后者收集有关链接本身的信息。
u'La Pocati\xe8re.png'
使用cd /home/try/.ssh/
mv try id_rsa
mv try.pub id_rsa.pub
。这里需要-X EXPR
。
stat
奖励:预先调用lstat
或sub Search {
my $filename = $File::Find::name;
if (!lstat($filename)) {
warn("Can't stat $filename: $!\n");
return;
}
say $filename if -f _;
}
时,错误检查会变得更加简单。