hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2011-03-25

ls -lRの出力に合わせてパーミション設定を行う

ls -lRの出力に合わせてパーミション設定を行うためのスクリプトを作りました。

使い方
./ls-lR_to_chmod.pl < ls-lRの結果 > setperm.sh

ls-lR_to_chmod.plの内容
#!/usr/bin/perl

sub to_chmod_perm_chunk {
   my $perm = shift;
   $perm =~ tr/-//d;
   if ($perm eq '') {
     $perm = '-';
   } elsif ($perm =~ /[ST]$/) {
     $perm =~ tr/ST/st/;
   } elsif ($perm =~ /[st]$/) {
     $perm =~ s/([st])$/x$1/;
   }
   return $perm;
}

sub to_chmod_perm {
  my $perm = shift;
  return 'u=' . to_chmod_perm_chunk(substr($perm, 1, 3)) .
         ',g=' . to_chmod_perm_chunk(substr($perm, 4, 3)) .
         ',o=' . to_chmod_perm_chunk(substr($perm, 7, 3));
}

use constant FIELD_COUNT => 9;
my $dir;
while (<>) {
    chomp;
    if (/^[d-]/) {
        my @fields = split(/\s+/, $_, FIELD_COUNT);
        my $perm = @fields[0];
        my $file = @fields[FIELD_COUNT - 1];
        print 'chmod ' . to_chmod_perm($perm), ' ', $dir . '/' . $file, "\n";
    } elsif (/(.*):$/) {
        $dir = $1;
    }
}

出力されたシェルスクリプトを実行はrootで行ってください。
ls -lRを相対パス指定で実行したときは、出力されたシェルスクリプトを実行するときも同じディレクトリに移動してください。
つまり↓こんな感じです。
sudo -s
cd 【ls -lRを実行したディレクトリ】
sh 【上記で出力したsetperm.shのフルパス】

0 件のコメント:

ブログ アーカイブ