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

Find symlink using Find in Perl

关于如何使用 Find 库在目录中查找符号链接,我遇到了一些问题,找不到它,而且我对使用 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,但是打印出来时没有符号链接。

File::Find::Rule implements the -X filetests,作为方法。测试条目是否为 symlink (-l) 的函数称为 symlink

根据我对这个问题的阅读,你不知道那个目录的名称(否则,为什么 "find" 里面有一个文件?),除了它是一个符号 link。然后你需要先找到 symlinks 的目录,然后在其中找到文件。对于第二个任务,您需要告诉模块 follow links.

我使用磁盘上的测试结构

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 个文件,它们是 symlinks。如上所述编写一个显式循环允许您添加代码来决定实际搜索哪个 symlink 目录。如果你不介意浏览所有这些,你可以这样做

my @files = File::Find::Rule->file->extras({follow => 1})->in(@symlink_dirs);

请参阅文档以了解使用您对 directory/file 的了解来限制搜索的功能。


如果 link 目录位于不包含目标的层次结构中,则只需搜索该层次结构。

有测试结构

other_hier/is_link  -> ../test_find/a/c
test_find/a/c/c.txt

你只需要告诉它跟随 links

my @all_files = File::Find::Rule  # may use linebreaks and spaces
    -> file
    -> extras({ follow => 1 })
    -> in('other_hier');

当添加到上面的程序并打印时,添加

another/is_link/c.txt

您当然可以用 $top_dir 替换文字 'other_hier' 并使用参数 other_hier 调用程序(并创建 other_hier 目录和 link里面)。

如果 link 和目标都在搜索的同一层次结构中,那么您不能这样做;搜索将 运行 变成循环 links(模块检测到并退出错误)。