探す。 .[^.]* -type f -print0 | xargs -0 sudo chmod 664 が動作しません。

探す。 .[^.]* -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 664xargs奇妙です(エラーメッセージはありません)。考えられる理由は何ですか?

編集:それとも大量のデータを配管するのが問題になる可能性がありますか?

答え1

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再度渡されるため、渡されたarg + envサイズの約2倍になり、制限が超過します。SUDO_COMMANDchmodchmod

答え2

渡した引数文字列が長すぎる可能性chmodがあります。ここにはいくつかのオプションがあります。

findのexecオプションを使用してください。

セミコロンと一緒に使用すると、findのexecオプションは見つかった各ファイルに対してコマンドを一度実行しますfind . .[^.]* -type f -exec sudo chmod 664 -- '{}' \;

xargs を使用して引数の数を制限します。

xargs -n5コマンドインスタンスごとに最大5つのパラメータを渡すことができます。この-sフラグを使用して、コマンドに渡される文字数を制限することもできますxargs -s4096。より良いパフォーマンスのために制限を増やすことができます。高すぎないように注意してください。

再帰 chmod

chmod再帰オプションがあります。ただし、これはディレクトリとファイルに影響します。ディレクトリから実行ビットの設定を解除することが心配な場合は、最初のコマンドを実行した後に実行chmod -R +X(大文字の使用を参照)して、Xディレクトリ内の実行ビットを繰り返し設定できます。

答え3

ディレクトリ名で何をしたいのか理解できません。どこかにバッファオーバーフローがあるようです。パイプまたはコマンドラインサイズ

努力する

find . -f file  -xargs chmod {}\;

chmodで-vを使用してechファイルが変更されたことを確認できます。

関連情報