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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Perl中的Find查找符号链接相关的知识,希望对你有一定的参考价值。

我遇到了一些关于如何使用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 "
file: $file
";

据说还有另一个目录包含指定的文件table.txt,但是它是一个符号链接,它是/ a / b / d,但打印出来时符号链接不存在。

答案

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

请注意,程序将在所有目录中找到符号链接的所有文件。编写如上所述的显式循环允许您添加代码以决定实际搜索哪个符号链接目录。如果你不介意翻阅所有这些,你可以这样做

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目录及其中的链接)。

如果链接和目标都在搜索的同一层次结构中,则您无法执行此操作;搜索将进入循环链接(模块检测到并以错误退出)。

以上是关于使用Perl中的Find查找符号链接的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?

使用sunOS中的find命令比较两个目录中的所有文件

查找指向目录的符号链接

查找断开的符号链接

Groovy集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )

Groovy集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )(代