如何使用File :: Find打印仅具有相对路径的文件?

时间:2009-11-10 12:46:38

标签: perl file-find

我在下面的代码中使用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...

有人可以建议我找到文件的代码,只显示当前的工作目录吗?

2 个答案:

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

这似乎对我有用。我也用子目录的目录测试了它,没有问题。