権限をデフォルト値にリセット

権限をデフォルト値にリセット

ファイルが作成されたときに設定された権限を持つように、マスクに基づいて権限をデフォルト値にリセットする方法

私が達成したいものの例: umask0022に設定して

touch file
mkdir directory

今ファイルの権限rw-r--r--

これで、ディレクトリの権限は次のようになります。rwxr-xr-x

chmod 777 file
chmod 777 directory

今ファイルの権限rwxrwxrwx

これで、ディレクトリの権限は次のようになります。rwxrwxrwx

ファイルとrw-r--r--ディレクトリの権限をデフォルト値にリセットする方法はありますか?rwxr-xr-xchmod

答え1

マイナスの使用は、特定のumask値に対してのみ正確です。たとえば、次のように使用することをお勧めします。mode & ~umaskPSkocikの答えから、またはchmod =rw(またはchmod =rwxディレクトリの場合)、標準指定のumaskを適用します。ilkkachuがコメントで指摘したように、


umask場合によっては、0666ファイルとディレクトリから単に権限を引いて0777基本的な権限を取得することもできます。

$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644

したがって、以下を申請できますchmod

chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory

Bashでは、次のように8進数の出力を強制する必要がありますprintf

$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755

別の方法は、新しいファイルとディレクトリを作成し、それを参照として使用することです。

touch file2
mkdir directory2 
chmod --reference=directory2 directory
chmod --reference=file2 file

答え2

マスクはマスクを介してANDビット単位で適用されるため、bitwise negated独自の最終権限パターンを作成したい場合は、次のことができます。

$((mode & ~umask))

次のアドレスに転送できるように、8進数で再印刷する必要がありますchmod

$ chmod `printf '%o' $((0777 & ~$(umask)))` directory
$ chmod `printf '%o' $((0777 & ~0111 & ~$(umask)))` file
#^additional implicit mask of 0111 for files

ここで、0777はマスクを適用する許可モードです(使用またはstat -c %a fileインポートできますstat -c %a directory)。

上記をエコーすることで、プロセス代替計算を確認できます(ofの場合はumask合計を0022取得します)。755644

これを使用して汎用関数を作成できます。

#takes a umask as first param and applies it to each folowing param (files)
maskMode(){
  local mask="$1" dmask mode a
  dmask="$((mask & ~0111))"; shift
  for a; do
    mode=0`stat -c "%a" "$a"`
    chmod `printf "%0.4o\n" $(($mode & ~mask))` "$a"
  done
}

特定の用途では、参照ファイルをchmodすることも別のオプションです。

答え3

現在のディレクトリを介して再帰的に実行するには -

chmod -R $((777 - `umask`)) .
chmod -R -x+X .

`umask`と交換してください$(umask)

答え4

再帰ファイルとディレクトリ

親ディレクトリのすべてのファイルとディレクトリを再帰的にリセットしたい場合:

sudo find . -type f -print0 | xargs -0 sudo chmod $((0666 - $(umask)))
sudo find . -type d -print0 | xargs -0 sudo chmod $((0777 - $(umask)))

説明する

別の答えは、個々のファイルとディレクトリを別々に使用してリセットする方法(または両方に1つのルールを繰り返し適用する方法chmod -R $((0666 - $(umask))))を示していますchmod -R $((0777 - $(umask)))。 (いい答えです。ありがとうございます!)

それから私は見つけました。この回答find を使用してディレクトリ全体にオプションで権限を適用する方法を示します。

find . -type f -print0 | xargs -0 chmod 644

これによりファイルが再帰的に変更される

find . -type d -print0 | xargs -0 chmod 755

ディレクトリに適用されます。

これらの答えを1つにまとめると、上記の解決策が提供されます。これにはそれぞれGNUバージョンの/ optionが必要ですfindxargs-print0-0

それが他の人に役立つことを願っています!

関連情報