如何使用Perl递归设置只读权限?

如何使用Perl递归设置只读权限?,perl,permissions,file-permissions,readonly,Perl,Permissions,File Permissions,Readonly,我希望$dir和它下面的所有内容都是只读的。如何使用Perl进行设置?您可以结合使用和chmod进行设置(请参阅): 未经测试,但应该有效。请注意,目录本身必须保持可执行状态 set_perms($dir); sub set_perms { my $dir = shift; opendir(my $dh, $dir) or die $!; while( (my $entry = readdir($dh) ) != undef ) { next

我希望
$dir
和它下面的所有内容都是只读的。如何使用Perl进行设置?

您可以结合使用和chmod进行设置(请参阅):


未经测试,但应该有效。请注意,目录本身必须保持可执行状态

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。

使用这个。比我的好。应该是:chmod0555,$File::Find::name;这将目录和文件都设置为555。虽然对于目录来说这没问题,但您可能不希望所有文件都是可执行的。我想我应该试试给出另一个答案的shell命令。@Jistanidiot:good catch;我已经更新了我的答案,所以只有目录才能获得+x位。如果您使用shell,
chmod-R
通常是最简单的。@Ether-chmod-R的问题是您无法区分目录和常规文件。您必须将所有文件设置为可执行文件,这可能会带来安全风险。
system("chmod", "--recursive", "a-w", $dir) == 0
  or warn "$0: chmod exited " . ($? >> 8);
system("chmod", "--recursive", "a-w", $dir) == 0
  or warn "$0: chmod exited " . ($? >> 8);