chmodとchownを同時に?

chmodとchownを同時に?

rsyncの後にファイルの所有権と権限を変更するスクリプトを実行しています。タスクを実行する最良の方法に関する質問に加えて、両方をchmod実行する方法があるかどうかを知りたいですchown

現在、スクリプトの反復ではfindファイルを2回処理しています。

find /var/www/mysite -exec chown  www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;

命令一つで権限と所有者/グループを変更できるなら本当にいいと思います。インターネット検索の後、そのようなコマンド、パラメータ、またはオプションが存在しないことに驚きました。

各ファイルを2回防ぐために権限と所有権を同時に変更できますかfind

編集するコミュニティの編集、投稿、その他のコンテンツによると、この質問は次のように重複します。「1つのコマンドですべてのフォルダ権限を変更してください」。この質問は変更について尋ねるので異なります。両方特権そして 所有権同時に、これは単なる権限に関するものではありません。

答え1

複数のexecコマンドを渡すことができます。

find /var/www/mysite -exec chown www-data:www-data {} \; \
     -type f -exec chmod 775 {} \;

答え2

rsyncコマンドに同等のオプションを追加できます。

rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>

ファイルとディレクトリにプレフィックスinを使用できますF--chmodD

答え3

完全性のためにパラメータパイプラインでは、あらゆる種類の興味深いタスクを実行できます。

find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '

これは、空の区切り文字を含むファイル名(ディレクトリ名ではない)ストリームを生成するため、ファイル名のスペースを処理します。

-0xargs に null への入力を切り離すよう指示します。各行で実行される以降のすべての代わりに「変数名」
-I VARとして使用されると言います。VAR{}
--

これは読みやすくなりますが、デュアルバレルコマンドを実行するたびに新しいシェルを起動します。

答え4

各ファイルについて2回心配する場合は、findxargsを介してコマンドの組み合わせを実行して発生するフォークの数についても心配する必要があります。

人々は、Perlがこれらの基本的なシェルコマンドの多くと同等の機能を持っているという事実を忘れてしまいます。私が行う1つの方法は次のとおりです(テスト済み)。

find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'

使用する必要があります数字uid、gid、modeですが、次の点を考慮してください。これはまったくフォークされませんfind(一つと一つを超えてperl)。

そして、Perlを理解するためにPerlをたくさん知る必要はありません。

chownとchmodはすでに明確です。シェルやコマンドと同じで、三項-d演算子はPerlに固有ではありません。 ([testfoo ? bar : bazボーナスとして、ディレクトリやファイルにさまざまなモードを使用できます。.)

実際にPerlを初めて使用する場合は、これらのオプションを説明する必要があります。少し簡単にするには:

  • -n「STDINの各行に対して1回実行し、その$_行に設定」を意味します。
  • -l各行末の改行文字を消すようにします(そうでなければ の一部になるからです$_)。
  • -e知っている人なら誰でも慣れるでしょうsed。これは評価/実行する式だと言います。

関連情報