我在下面的代码中使用File::Find来查找/home/user/data
路径中的文件。
use File::Find;
my $path = "/home/user/data";
chdir($path);
my @files;
find(\&d, "$path");
foreach my $file (@files) {
print "$file\n";
}
sub d {
-f and -r and push @files, $File::Find::name;
}
当我将dir路径更改为我需要搜索文件的路径时,但它仍然为我提供了完整路径的文件。即。
/home/user/data/dir1/file1
/home/user/data/dir2/file2
and so on...
但我希望输出像
dir1/file1
dir2/file2
and so on...
有人可以建议我找到文件的代码,只显示当前的工作目录吗?
答案 0 :(得分:13)
以下内容将打印$base
下相对于$base
(不是当前目录)的所有文件的路径:
#!/usr/bin/perl
use warnings;
use strict;
use File::Spec;
use File::Find;
# can be absolute or relative (to the current directory)
my $base = '/base/directory';
my @absolute;
find({
wanted => sub { push @absolute, $_ if -f and -r },
no_chdir => 1,
}, $base);
my @relative = map { File::Spec->abs2rel($_, $base) } @absolute;
print $_, "\n" for @relative;
答案 1 :(得分:3)
如何删除它:
foreach my $file (@files) {
$file =~ s:^\Q$path/::;
print "$file\n";
}
注意:这实际上会更改@files
的内容。
根据评论,这不起作用,所以让我们测试一个完整的程序:
#!/usr/local/bin/perl
use warnings;
use strict;
use File::Find;
my $path = "/usr/share/skel";
chdir($path);
my @files;
find(\&d, "$path");
foreach my $file (@files) {
$file =~ s:^\Q$path/::;
print "$file\n";
}
sub d {
-f and -r and push @files, $File::Find::name;
}
我得到的输出是
$ ./find.pl dot.cshrc dot.login dot.login_conf dot.mailrc dot.profile dot.shrc
这似乎对我有用。我也用子目录的目录测试了它,没有问题。