2009-11-10 27 views
4

我在下面的代碼中使用File::Find來查找/home/user/data路徑中的文件。如何使用File :: Find僅使用相對路徑打印文件?

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; 
} 

由於我從那裏我需要搜索的文件更改目錄路徑,該路徑,但仍然它給我的完整路徑文件。即

/home/user/data/dir1/file1 
/home/user/data/dir2/file2 
and so on... 

,但我要像

dir1/file1 
dir2/file2 
and so on... 

輸出任何人都可以請建議我的代碼,以找到唯一的當前工作目錄下的文件,並顯示?

回答

12

以下將打印的所有文件$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

+1促進'File :: Spec' – 2009-11-10 14:16:37

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 

這似乎是工作確定了我。我也用目錄和子目錄對它進行了測試,沒有問題。

+0

謝謝,但它不是爲我工作。仍然得到完整的路徑。 – Space 2009-11-10 13:10:51

+1

它適合我。你確定你把所有的東西都複製了嗎? – 2009-11-10 13:20:38

+0

是的,我已經複製並粘貼,但它給出從/完整路徑。 – Space 2009-11-10 13:26:05