恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

ファイルだけ(ディレクトリだけ)をchmodする and umask

サブマシンで遊び始めてから少し経ちますが、作成したファイルのパーミッションが適切でないことに気づきました。

そこで、ファイルのパーミッションを600に、ディレクトリのパーミッションを700にしようかと

find . -type f -print | xargs chmod 600
find . -type d -print | xargs chmod 700

を実行したのですが、名前にスペースが入っているファイルやディレクトリに対する処理で「そんなファイルやディレクトリは無いでげす」と言われてしまいました。

原因は、xargsが「空白や改行」を区切りとして認識することです。よって、

Old patek

のようなスペースを含むディレクトリ名があった場合、「Old」と「patek」という別々のディレクトリとして処理されてしまいます。

そんなわけで、適切に処理を行うにはxargsが認識する区切り文字を変更する必要があります。

一般的な対応方法

Linuxを使っている人々の間で一般的なのは、区切り文字をヌル文字にする方法です。

たとえば、

xargs -0

とすると、xargsはヌル文字を区切り文字として認識します。

この場合、find側でも出力結果の区切り文字をヌル文字にする必要があるので、「-print0」を使って

find . -type f -print0 | xargs -0 chmod 600
find . -type d -print0 | xargs -0 chmod 700

のようにします。

別の対応方法

上記「一般的な対応方法」でも何ら問題は無いのですが、個人的にはfindの出力が行単位になっているのなら、xargsが改行だけを区切り文字と解釈してくれれば良いと思います。

そんなわけで、

find . -type d -print | xargs -d '\n' chmod 700

としても目的は達成できます。
この例では、xargsの後ろにある「-d '\n'」により、xargsは改行を区切り文字として認識します。

このやり方に問題があるとすれば、findの出力結果が「\n」ではない場合でしょうか。自分はDebianでしか実験していませんし、他のシステムのことを余り分かっていないのですが、もしも他のシステムで使われているfindの出力結果において、行末が「\n」以外のものになっていたら、この方法は破綻します。

umask(デフォルトパーミッションの設定)

今後の手間を省くために.bashrcに以下の記述を追加しておきました。

umask 0077


余談ですが、umaskの使い方を見るときはmanコマンドではなく

help umask

となります。

setfaclコマンド

umaskの他にsetfaclコマンドというものもパーミッションの制御に使えるようです(まだ詳細は調べていません、汗)。