このコマンドを使用して、ファイルのアクセス許可を再帰的に設定しています
clime@vm6879 /srv/www-php/steeltrading $ find . .[^.]* -type f -print0 | xargs -0 Sudo chmod 664
ただし、そのコマンドを実行した後でも、一部のファイル(ほとんどのファイル)のアクセス許可は変更されません。
clime@vm6879 /srv/www-php/steeltrading $ ll media/xmlconnect/system/ok.gif
-rwxrwxr-x. 1 www www 295 Jul 5 2012 media/xmlconnect/system/ok.gif
find
だけを実行してファイルがリストにあるかどうかを確認すると、次のことがわかります。
clime@vm6879 /srv/www-php/steeltrading $ find . .[^.]* -type f | grep ok.gif
./media/xmlconnect/custom/ok.gif
./media/xmlconnect/original/ok.gif
./media/xmlconnect/system/ok.gif
ディレクトリメディアに移動してコマンドを再度実行すると、ファイルは最終的に適切なアクセス許可を取得します。
clime@vm6879 /srv/www-php/steeltrading $ cd media/
clime@vm6879 /srv/www-php/steeltrading/media $ find . .[^.]* -type f -print0 | xargs -0 Sudo chmod 664
clime@vm6879 /srv/www-php/steeltrading/media $ ll xmlconnect/system/ok.gif
-rw-rw-r--. 1 www www 295 Jul 5 2012 xmlconnect/system/ok.gif
一部のファイルでSudo chmod 664
が実行されていないようで、xargs
が問題のようですが、奇妙です(エラーメッセージはありません)。原因は何か考えてください。
編集:あるいは、大量のデータのパイピングが問題になる可能性がありますか?
find
はドットファイルをスキップしないため、_.[^.]*
_(標準構文では_.[!.]*
_)は冗長であり、これらのファイルは2回処理されます(ディレクトリは2回降順されます)。 (たとえば、_.[!.]*
_は_..foo
_と呼ばれるファイルを見逃していることにも注意してください)。
ただし、デフォルトでは、find
はディレクトリへのシンボリックリンクになりません。したがって、media
が_.
_の外側の領域へのシンボリックリンクである場合、そこにあるファイルは処理されません。
_-L
_を使用して、findにシンボリックリンクをたどるように指示できます。ただし、通常のファイルへのシンボリックリンクであるファイルに対してもchmod
が呼び出されることに注意してください。
_Sudo find -L . -type f -exec chmod 664 {} +
_
または、いくつかのfind
/xargs
実装の場合:
_find -L . -type f -print0 | Sudo xargs -r0 chmod 664
_
ここで述べたこととは逆に、xargs
と_find -exec +
_は、引数のリストが大きすぎる場合は、chmod
に分割します。
ただし、ここで説明している制限は、コマンドに(execve(2)
システムコールに)渡される引数と環境の累積サイズであることに注意してください。
find
およびxargs
は、その制限に達していないことを確認します(そして、少しマージンを残します)が、次のように実行した場合:
_find . -type f -print0 | xargs -r0 Sudo chmod 644
_
の代わりに:
_find . -type f -print0 | Sudo xargs -r0 chmod 644
_
Sudo
コマンド(xargs
によって呼び出される)は、chmod
に渡すすべての引数を受け取り、ファイルのリストを含む_Sudo_COMMAND
_環境変数をchmod
に渡すため、arg +の約2倍のサイズになります。 envはchmod
に渡され、制限を超えた理由を説明します。
chmod
に渡す引数文字列が長すぎる可能性があります。ここにはいくつかのオプションがあります。
findのexecオプションを使用
セミコロンとともに使用すると、findのexecオプションは、見つかったファイルごとに1回コマンドを実行します:find . .[^.]* -type f -exec Sudo chmod 664 -- '{}' \;
。
xargsで引数の数を制限する
xargs -n5
は、コマンドインスタンスごとに最大5つの引数を渡します。 -s
フラグを使用して、コマンドに渡される文字数を制限することもできます:xargs -s4096
。パフォーマンスを向上させるために制限を増やすことができます。高くならないように注意してください。
再帰的なchmod
chmod
には再帰的なオプションがあります。ただし、これはファイルだけでなくディレクトリにも影響します。ディレクトリの実行ビットの設定を解除する必要がある場合は、最初のコマンドを実行した後にchmod -R +X
(大文字のX
に注意)を実行して、ディレクトリの実行ビットを再帰的に設定できます。