#!/usr/bin/perl -w
#a type of wrapper to using the find command to change permissions
#find ./ -type d -exec chmod 0755 {} \;
use strict;
use Getopt::Long;
use File::Find;
my %opts = (
verbose => '',
help => '',
filemode => '',
dirmode => ''
);
if (!GetOptions(\%opts, 'verbose', 'help', 'filemode:s', 'dirmode:s'))
+ {
usagedie();
}
if ($opts{'help'}) {
usagedie();
}
foreach (@ARGV) {
usagedie() if (!-f && !-d);
}
usagedie() if (!$opts{'filemode'} && !$opts{'dirmode'});
$opts{'filemode'} = chkperm('File', $opts{'filemode'});
$opts{'dirmode'} = chkperm('Directory', $opts{'dirmode'});
#use default directory if argument not set on command line
find(\&fileop, @ARGV ? @ARGV : './');
sub fileop {
#set the right permissions based on if a file or a directory
#only set permissions if the mode is set
#dont set permissions if they are already set right
if (-f && $opts{'filemode'}
&& ((stat($File::Find::name))[2] & 07777) != $opts{'filemo
+de'}) {
chmod $opts{'filemode'}, $_;
}
elsif (-d && $opts{'dirmode'}
&& ((stat($File::Find::name))[2] & 07777) != $opts{'di
+rmode'}) {
chmod $opts{'dirmode'}, $_;
}
else {
#dont print if we didnt modify file perms
return;
}
print $File::Find::name . "\n" if $opts{'verbose'};
}
sub chkperm {
my ($type, $perm) = @_;
#zero length strings are defined values
#our $perm 's by default are set to ''
if ($perm) {
return ($perm =~ /^[0-7]{4}$/)
? oct($perm)
: die "Incorrect $type mode $perm\n";
}
return;
}
sub usagedie {
print "Usage: setperm.pl [-v] [-f perm] [-d perm] [Directory]\n";
print "-v, --verbose\t show files changed by script\n";
print "-f, --filemode\t octal mode to change files to\n";
print "-d, --dirmode\t octal mode to change directories to\n";
exit(1);
}