このコマンドを使用してファイルの権限を再帰的に設定しています。
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
奇妙です(エラーメッセージはありません)。考えられる理由は何ですか?
編集:それとも大量のデータを配管するのが問題になる可能性がありますか?
答え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_COMMAND
chmod
chmod
答え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ファイルが変更されたことを確認できます。