2010-09-17 12 views

Répondre

9

Vous pouvez le faire avec une combinaison de File::Find et chmod (voir 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

Utilisez celui-ci. Mieux que le mien. – Cfreak

+0

Devrait-il être: chmod 0555, $ File :: Find :: name; –

+0

Cela définit les répertoires et les fichiers à 555. Bien que ce soit bon pour un répertoire, vous ne voudrez probablement pas tous vos fichiers exécutables. Je pense que j'essaierais les commandes du shell donné l'une des autres réponses. – Jistanidiot

1

Untested mais il devrait fonctionner. Notez vos répertoires eux-mêmes doivent rester exécutable

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

Bien sûr, vous pouvez exécuter une commande shell de Perl ainsi:

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

-je utiliser xargs au cas où vous avez un grand nombre d'entrées.

+1

Si vous utilisez le shell, 'chmod -R' est généralement le plus facile. – Ether

+0

@Ether - le problème avec chmod -R est que vous ne pouvez pas faire la distinction entre les répertoires et les fichiers réguliers. Vous devez définir tous les fichiers sur exécutable, ce qui peut représenter un risque de sécurité. – Cfreak

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