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のフルパス】

LinuxのパーミションのSとTの大文字小文字の違い

実験してみたところ実行パーミション(x)がついているときは小文字、ついていないときは大文字になるようです。
sとtについてはLinux Files and File Permissionsを参照。

chmodで指定するときは以下のようにします。
$ chmod o=rxt hoge
$ ls -l hoge
-rw-r--r-t 1 user1 group1 0 Mar 25 11:19 hoge
$ chmod o=rt hoge
$ ls -l hoge
-rw-r--r-T 1 user1 group1 0 Mar 25 11:19 hoge

ブログ アーカイブ