在 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(模块检测到并退出错误)。
关于如何使用 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(模块检测到并退出错误)。