Как я могу рекурсивно установить разрешение только для чтения, используя Perl? - PullRequest
3 голосов
/ 17 сентября 2010

Я бы хотел, чтобы $dir и все, что находится под ним, было доступно только для чтения. Как я могу установить это с помощью Perl?

Ответы [ 3 ]

10 голосов
/ 17 сентября 2010

Вы можете сделать это с помощью комбинации 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);
2 голосов
/ 18 сентября 2010
system("chmod", "--recursive", "a-w", $dir) == 0
  or warn "$0: chmod exited " . ($? >> 8);
1 голос
/ 17 сентября 2010

Не проверено, но оно должно работать.Обратите внимание, что ваши каталоги должны оставаться исполняемыми

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:

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

Я использую xargs, если у вас много записей.

...