web-dev-qa-db-ja.com

見つける。 。[^。] * -type f -print0 | xargs -0 Sudo chmod 664;動作しません

このコマンドを使用して、ファイルのアクセス許可を再帰的に設定しています

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が問題のようですが、奇妙です(エラーメッセージはありません)。原因は何か考えてください。

編集:あるいは、大量のデータのパイピングが問題になる可能性がありますか?

3
clime

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に渡され、制限を超えた理由を説明します。

6

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に注意)を実行して、ディレクトリの実行ビットを再帰的に設定できます。

1
user26112