2013-05-03 150 views
2

我想刪除給定路徑上的所有目錄,如果它們包含某個文件。如何使用perl rmtree樹刪除目錄,如果它包含某個文件?

#!/usr/bin/perl 

use strict; 
use File::Find; 
use File::Path qw(rmtree); 

find(\&rm_errors, $_) for @ARGV; 

sub rm_errors{ 
    if ($_ eq "git_errors.txt"){ 
    my $path = $File::Find::dir; 
    rmtree($path); 
    } 
} 

查找包含文件的目錄正在工作,但rmtree沒有刪除該目錄。誰能告訴我爲什麼?

+2

的Perl也許能告訴你爲什麼:'rmtree($路徑)或死亡 「不能rmtree '$ PATH':$!」'也就是說,包括'$'誤差在模具中陳述報告變量! – TLP 2013-05-03 12:40:54

回答

4

對於你所要求的迫切的問題,找出問題是什麼的方法是使用一個診斷die聲明:

rmtree($path) or die "Cannot rmtree '$path' : $!"; 

這樣的話,您將瞭解什麼樣的錯誤,系統將報告。

但是,還有另一個問題。您在迭代文件系統時會影響文件系統,這不是一個好主意。像這樣的東西可能會更好:

my @dirs; 
find(sub { push @dirs, $File::Find::dir if $_ eq "git_errors.txt" }, $_) for @ARGV; 
for my $path (@dirs) { 
    rmtree($path) or die "Cannot rmtree '$path' : $!"; 
} 

也就是說,首先找到目錄,然後刪除它們。

+0

由於File :: Find的遍歷順序可能會在找到並添加子目錄之前找到父目錄並將其添加到@dirs,因此需要注意'rmtree(...)或die ...'。之後,父項將被刪除,然後當其在@dirs中的條目被刪除時該子項將不存在。也許查找調用中的'sub {}'應該修剪搜索以及添加找到的目錄。 – AdrianHHH 2013-05-03 13:26:25

+0

@AdrianHHH好點。你也可以把'die'改成'warn'。 – TLP 2013-05-03 13:30:44

0

據我所知,找到更改目錄遍歷文件系統。

(從的perldoc:另外,對於每一個目錄中找到,它會CHDIR()進入該目錄,並繼續搜索,調用&希望在目錄中的每個文件或子目錄功能。)

這意味着, ,除了試圖修改你正在遍歷的結構之外,你還在你想刪除的目錄中。

我不認爲這是從命令行工作。

相關問題