使用Perl中的Find查找符号链接

时间:2018-08-30 04:17:15

标签: perl find symlink

我在使用查找库如何在目录内查找符号链接时遇到了一些问题,找不到该链接,而且我在使用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的符号链接,但是在打印出来时该符号链接不存在。

1 个答案:

答案 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>

如果链接和目标都在搜索的同一层次结构中,则不能执行此操作;搜索将遇到循环链接(模块会检测到该链接并错误退出)。