これは再帰的な「chmoding」に関するより一般的な質問です。
ある時点で、何十万ものファイルを含むフォルダのアクセス許可を繰り返し変更する必要があるこのスクリプトがあります。毎日新しいファイルがフォルダに追加されますが、既存のファイルには権限が設定され、変更されません。
私の問題は...私が電話したとき
chmod 775. -アル字型
すでに正しい権限が設定されているファイルに対して権限を設定しようとしていますか、または正しい権限を持たない新しいファイルに対してのみ権限を設定しますか?
「新しい」ファイルが数千にすぎず、その権限をかなり迅速に適用する必要があるにもかかわらず、スクリプトでこのコマンドを実行するには常に長い時間がかかるようです。
chmodのマニュアルページを見てみましたが、この状況については何も言及していないようです。
chmodが事前に権限を確認しない場合は、「find」と「chmod」の組み合わせを検討する必要がありますか?
答え1
検索/chmod最適化
両方読まなければfind
ならないchmod
- すべてのディレクトリエントリ
- これらすべての項目の索引ノード
すべての項目を最初に読み、次に回転ディスクのすべての inode を読み取ってパフォーマンスを向上させることができます。その理由は、ディスクヘッドがディレクトリとinodeの間を移動しないためです。 〜のようにchmod
はい愚かなことは、(他の答えの1つが説明したように)find
呼び出す必要があります。ただし、最初の inode が作成される前にすべての inode を読み取ると便利です (ディスクのキャッシュに十分な空き RAM があると仮定します)。私はこれを提供する:
find . -printf "" # reading the file names only
find . ! -perm 775 -printf "" # reading all the inodes (file names are cached)
find . ! -perm 775 -exec chmod 775 + # writing to the cache without reading from disk
良いソリューション:ACL
良い解決策は全く異なるかもしれません。ファイルがこのディレクトリに作成され、他の場所から移動されなかった場合、ACLはすぐに操作を実行できます。親ディレクトリにデフォルトのACLを設定するだけです。
ファイルシステムの最適化により、さらなる改善を実現できます。 ext3/ext4の場合、e2fsck -D
随時実行できます。おそらく、このディレクトリを別々のボリュームに置くと便利です。他のファイルシステムやファイルシステムの設定(たとえば、異なるinodeサイズ)を試すことができます。
答え2
chmod
fromを使用すると仮定GNU coreutilsパッケージUbuntu 12.10で。
chmod 775 . -R
fchmodat
権限を変更する必要があるかどうかに関係なく、見つかったすべてのファイルに対してシステムコールを実行します。コードを調べて(下のスニペット)を使用して、実際の動作を一覧表示してstrace chmod 775 . -R
それを確認しました。
newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775) = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775) = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775) = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775) = 0
fchmodat
各ファイルで実行するにはいくつかの欠点があります。
- 多数のファイルを変更すると、追加のシステムコールが大きくなる可能性があります。 //他の人が言及した方法は、変更が必要なファイル
find
だけxargs
を変更するとより速くなることがあります。chmod
fchmodat
各ファイルの状態を変更するファイル変更(ctime)を呼び出します。これにより、すべてのファイル/ノードが毎回変更され、過度のディスク書き込みが発生する可能性があります。これらの重複書き込みは、マウントオプションを使用して停止できます。
簡単な実験は、直接発生するctimeの変化を示しています。chmod
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
しかし、それは変わりませんでしたfind
//数分後でもxargs
chmod
auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
find
私は常に // バージョンを使用する傾向があります。 find を使用すると、選択した項目をより適切に制御できるためxargs
です。chmod
答え3
chmod
必要に応じて設定されたファイルの権限を変更したり変更したりすることはできませんが、そうでない場合でも現在の権限が何であるかを確認する必要があります[0]。何十万ものファイルがあるため、各ファイルをスキャンするのに時間がかかる可能性がありますstat
。
find
最後の実行よりも最新のファイルやchmod
実行する必要があるファイルの確認を試してみることができますが、速度は大幅に向上しないようです。
スクリプトを使用して可能であれば、まず新しいファイルを「保留」領域として別のディレクトリに配置できます。その後、そのディレクトリの残りのファイルと一緒に入れることができますchmod
(新しいファイルのみを含む)。mv
この方法ははるかに高速ですが、残念ながらすべてのアプリケーションで動作するわけではありません。
[0] 変更を必要としないファイルの権限を設定しようとしても、デフォルトのファイルシステムは不要であるため、要求に対して何もしないことがあります。
答え4
0775モードを使用してファイルを生成するプロセスを変更してファイルを生成することを検討しましたか?あなたの環境でumask値0002を見てみると便利です。