我在使用查找库如何在目录内查找符号链接时遇到了一些问题,找不到该链接,而且我在使用Perl方面还很陌生。
use strict;
use warnings;
use File::Find::Rule;
use File::Find;
use File::Copy;
my @files = File::Find::Rule->file()
->name( 'table.txt' )
->in( '/a/b/c' );
for my $file (@files)
{
print "\nfile: $file\n";
应该还有另一个目录,其中包含指定的文件table.txt,但这是一个/ a / b / d的符号链接,但是在打印出来时该符号链接不存在。
答案 0 :(得分:2)
File::Find::Rule实现-X filetests作为方法。测试条目是否为符号链接(-l
)的那个称为symlink
。
在阅读问题时,您不知道该目录的名称(否则,为什么要在其中“查找”文件?),只是它是一个符号链接。然后,您需要首先找到符号链接目录,然后在其中查找文件。对于第二项任务,您需要告诉模块关注链接。
我在磁盘上使用测试结构
test_find/a/c/c.txt test_find/a/b/b.txt test_find/is_link -> a/c ("is_link" is a symbolic link to "a/c")
并在其上方的目录中运行程序
use warnings;
use strict;
use feature 'say';
use File::Find::Rule;
my $top_dir = shift @ARGV || './test_find';
my @symlink_dirs = File::Find::Rule->directory->symlink->in($top_dir);
foreach my $dir (@symlink_dirs) {
my @files = File::Find::Rule->file->extras({follow => 1})->in($dir);
say "in $dir: @files";
}
可打印
in test_find/is_link: test_find/is_link/c.txt
请注意,程序将在符号链接的 all 目录中找到 all 个文件。如上所述编写一个显式循环,使您可以添加代码来确定要实际搜索的符号链接目录。如果您不介意浏览所有内容,则可以
my @files = File::Find::Rule->file->extras({follow => 1})->in(@symlink_dirs);
请参阅文档以获取功能,以使用对目录/文件的了解限制搜索。
如果链接目录位于不包含目标的层次结构中,则只需搜索该层次结构。
具有测试结构
other_hier/is_link -> ../test_find/a/c test_find/a/c/c.txt
您只需要告诉它遵循链接即可
my @all_files = File::Find::Rule # may use linebreaks and spaces
-> file
-> extras({ follow => 1 })
-> in('other_hier');
添加到上述程序中并打印时会添加
another/is_link/c.txt
您当然可以将文字'other_hier'
替换为$top_dir
,并用参数other_hier
调用程序(并建立other_hier
目录及其中的链接)。 / p>
如果链接和目标都在搜索的同一层次结构中,则不能执行此操作;搜索将遇到循环链接(模块会检测到该链接并错误退出)。