探す。 .[^.]* -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

おすすめ記事