ファイルが作成されたときに設定された権限を持つように、マスクに基づいて権限をデフォルト値にリセットする方法
私が達成したいものの例:
umask
0022に設定して
touch file
mkdir directory
今ファイルの権限rw-r--r--
これで、ディレクトリの権限は次のようになります。rwxr-xr-x
chmod 777 file
chmod 777 directory
今ファイルの権限rwxrwxrwx
これで、ディレクトリの権限は次のようになります。rwxrwxrwx
ファイルとrw-r--r--
ディレクトリの権限をデフォルト値にリセットする方法はありますか?rwxr-xr-x
chmod
答え1
マイナスの使用は、特定のumask値に対してのみ正確です。たとえば、次のように使用することをお勧めします。mode & ~umask
PSkocikの答えから、または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
取得します)。755
644
これを使用して汎用関数を作成できます。
#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が必要ですfind
。xargs
-print0
-0
それが他の人に役立つことを願っています!