2016-11-09 218 views
1

我使用next if $file eq '.' $file eq '..';在目錄和子目錄(除少數目錄之外)中查找文件並打開查找和替換文件。但是,當我有文件夾名稱中的點時,它認爲該文件夾是一個文件,並說無法打開。我使用-f篩選文件,但缺少顯示主文件夾中的文件。在文件夾和子文件夾中查找文件

是否有任何遞歸的方式來找到文件夾和文件,即使它有點。

opendir my $dh, $folder or die "can't open the directory: $!"; 

while (defined(my $file = readdir($dh))) { 

    chomp $file; 

    next if $file eq '.' $file eq '..'; 

    { 
     if ($file ne 'fp') { 

      print "$folder\\$file"; 

      if ($file =~ m/(.[^\.]*)\.([^.]+$)/) { 
       ... 
      } 
     } 
    } 
} 
+0

你忘了''||(或)在未來'如果$文件EQ '' $ file eq'..';'?它應該是'next if($ file eq'。'|| $ file eq'..');'(儘管這不能解決遞歸問題)。 – PerlDuck

+0

'chomp $ file;'是不需要的。 'readdir'的結果沒有尾隨換行符。 – shawnhcorey

回答

4

按照Sobrique的建議,您可以使用File::FindFile::Find::Rule

這是非常容易使用:

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::Find; 
sub process_file { 
    next if (($_ eq '.') || ($_ eq '..')); 
    if (-d && $_ eq 'fp'){ 
     $File::Find::prune = 1; 
     return; 
    } 
    print "Directory: $_\n" if -d; 
    print "File: $_\n" if -f; 
    #Do search replace operations on file below 
} 
find(\&process_file, '/home/chankeypathak/Desktop/test.folder'); #provide list of paths as second argument. 

我有如下的文件結構。

test.folder/test.txt 
test.folder/sub.folder 
test.folder/sub.folder/subfile.txt 
test.folder/fp 
test.folder/fp/fileinsidefp.txt 

而且我得到了下面的輸出

$ perl test.pl 
File: test.txt 
Directory: sub.folder 
File: subfile.txt 
+1

'File :: Find'是一個標準模塊;它帶有Perl。 'File :: Fins :: Rule'必須從CPAN安裝。有關標準模塊的列表,請參閱'perldoc perlmodlib'。 – shawnhcorey

+1

以及@shawnhcorey所說的,你可以在命令行上使用'corelist'來檢查一個特定的模塊是否爲核心:'corelist File :: Find' – stevieb

+0

只需要一個條件'if(-d && $ _ eq 'FP'){下次;}'。 –

3

是的。使用File::Find::Rule

foreach my $file ( File::Find::Rule->file()->in(".")) { 

} 

......就是這樣。幾乎所有'文件測試'標誌都有選項,所以file()對於-freadable()對於-r

相關問題