#!/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); }
[download]