Backup прав доступа на файлы и директории[only for unix like systems]

Программа, восстанавливающая пермишны на файлы например в случае непреднамеренного использования команды chmod -R 777 *.* из корневой директории(или в аналогичных ситуациях). В комментариях разъяснена работа программы:

#!/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 - пишите.