#!/usr/bin/perl -w
use strict;
use File::Find;
my ($test, $dir, $db, $pwd, $tmp);
$db="/home/user/cgi/xxx.dat";
###################
#program section #
###################
&exc(); #read exceptions
unlink $db if !-z $db and $ARGV[0] eq 'r';
#стираем файл старой базы при команде r в случае если он ненулевого размера
find \&read => "$dir" if $ARGV[0] eq 'r';
#начать сканировать поддиректории если с командной строки пришло r
rewrite() if $ARGV[0] eq 'w';
#начать восстанавливать права на файлы, если с командной строки пришло w
##################
#subroutines #
##################
sub read {#чтение прав
$test=sprintf "%04o" => (stat($File::Find::name))[2] & 07777;
#получить права на файл ли директорию
&readchmod("$File::Find::name\t$test\n");
#вызов подпрограммы для записи базы
}
sub readchmod{#запись прав
open F, ">>$db" or die "Can't open $db: $!";
print F $_[0];
print "$_[0]"; #смотрим, что записывается
close F;
}
sub rewrite{#перезапись прав
open F, "<$db" or die "Can't open $db: $!";
while(){ chop; #читаем построчно в $_ и отъедаем от него перевод
каретки
my ($file, $chmod) = split /\t/;
qx [chmod $chmod $file]; #даем системную команду chmod
print "$chmod\t=>\t$file\n"; #смотрим, что делает программа
} close F;
}
sub exc{
do{print "Type './chmod.pl ?' or './chmod.pl h'\n"; exit 0}
if $#ARGV==-1;#обрабатываем пустой ввод вида ./chmod.pl
do {print "Your command must be 'w', 'r', 'h' or '?'!\n"; exit 0}
if $ARGV[0]!~m%^[wr?h]$% and $#ARGV!=-1;
#обрабатываем все остальные буквы, кроме необходимых
do{ print qq~
Программа создает базку пермишнов на файлы и директории на
случай экстренных ситуаций вроде неправильного или случайного
использования команды chmod -R 777 из корневой директории.
chmod.pl [w|r|h|?] [/полный/путь/до/директории]
Для указания директории, от которой будет создаваться база
пермишнов, нужно ввести команду "r /path/you/dir"
Для создания базы на права для файлов и дирректорий
Вы должны ввести "r".
Для восстановления прав на файлы и директории вы должны
ввести команду "w".
Справка по командам "?" или "h".
Второй аргумент должен быть полным путем к директории, от которой нужно
начинать рекурсивно сохранять права. По умолчанию стоит текущая
директория. Например если Вы запустили программу из корневой директории,
то текущей директорией начала просмотра подкаталогов будет считаться
корневая директория, если в файле /home/user/.shrc внесена переменная
окружения $ENV{PWD}.
~; exit 0}
if $ARGV[0]=~m!^[?h]$!; #выводим хелп
if($ARGV[1] eq ''){#есл не ввели второго аргумента в командной строке
#то определяем переменную $dir
#while(my ($k, $v)=each %ENV){print "$k\t=>\t$v\n"}
#смотрим, что содержит переменная окружения,
#содержащаяся в /home/user/.shrc
$dir=$ENV{PWD};
#определяем директорию запуска скрипта, чтобы с этой точки начать
#поход по поддиректориям
} else {
-d $ARGV[1] or die "$!";#если то, что пришло вторым аргументом
#директория, то идем дальше, иначе читаем
#ошибку
$dir=$ARGV[1];
}
return 1;
}
Если нашли a lot of bugs - пишите.