2010-09-17 51 views

回答

9

你可以用File::Find和chmod組合(見perldoc -f chmod)做到這一點:

use File::Find; 

sub wanted 
{ 
    my $perm = -d $File::Find::name ? 0555 : 0444; 
    chmod $perm, $File::Find::name; 
} 
find(\&wanted, $dir); 
+0

使用這一個。比我的好。 – Cfreak 2010-09-17 19:32:11

+0

應該是:chmod 0555,$ File :: Find :: name; – 2011-12-20 17:31:52

+0

這會將目錄和文件都設置爲555.儘管對於某個目錄而言沒有問題,但您可能不希望所有文件都可執行。我想我會嘗試其他答案之一的shell命令。 – Jistanidiot 2012-10-08 14:57:17

1

未經測試,但它應該工作。請注意您的目錄本身必須保持可執行

set_perms($dir); 

sub set_perms { 
    my $dir = shift; 
    opendir(my $dh, $dir) or die $!; 
    while((my $entry = readdir($dh)) != undef) { 
      next if $entry =~ /^\.\.?$/; 
      if(-d "$dir/$entry") { 
       set_perms("$dir/$entry"); 
       chmod(0555, "$dir/$entry"); 
      } 
      else { 

       chmod(0444, "$dir/$entry"); 
      } 
    } 
    closedir($dh); 
} 

當然,你可以從Perl中執行shell命令,以及:

system("find $dir -type f | xargs chmod 444"); 
system("find $dir -type d | xargs chmod 555"); 

我用xargs的情況下,你有很多條目。

+1

如果你使用shell,'chmod -R'通常是最簡單的。 – Ether 2010-09-17 19:37:41

+0

@Ether - chmod -R的問題是您無法區分目錄和常規文件。您必須將所有文件設置爲可執行文件纔是安全風險。 – Cfreak 2010-09-19 02:37:37

3
system("chmod", "--recursive", "a-w", $dir) == 0 
    or warn "$0: chmod exited " . ($? >> 8);