5

パスからファイルを見つけるために、以下のコードで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...

誰かが私にファイルを見つけて現在の作業ディレクトリからのみ表示するためのコードを提案してもらえますか?

4

2 に答える 2

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;
于 2009-11-10T13:06:56.040 に答える
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

これは私には問題なく機能しているようです。サブディレクトリのあるディレクトリでもテストしましたが、問題ありません。

于 2009-11-10T13:05:43.700 に答える