Rsync後にファイルの所有権と権限を修正するために実行しているスクリプトがあります。私のタスクを別の方法で実行するための最適な方法についての質問は、chmod
とchown
を同時に実行する方法はあるのでしょうか。
スクリプトの現在の反復では、ファイルを2回find
ingしています。
find /var/www/mysite -exec chown www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;
権限と所有者/グループの両方を1つのコマンドで変更できたらいいと思いました。少しググった後で、そのようなコマンド、引数、またはオプションが存在しないことを知って驚いた。
各ファイルを2回find
ingしないように、権限と所有権の両方を同時に変更できますか?
Editコミュニティの編集または投稿、またはこの質問が "1つのコマンドですべてのフォルダのアクセス権を変更する" の複製であることを示唆する何か。この質問は、両方権限とownershipと同時に、権限だけではありません。
複数のexecコマンドを渡すことができます:
find /var/www/mysite -exec chown www-data:www-data {} \; \
-type f -exec chmod 775 {} \;
rsync
コマンドに同等のオプションを追加できます。
rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>
ファイルの場合は--chmod
で、ディレクトリの場合はF
でプレフィックスD
を使用できます。
完全を期すために、xargsは、パイプラインでもあらゆる種類の興味深いことを実行できます。
find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '
これにより、区切り文字にnullを含むファイル名のストリーム(ディレクトリ名ではない)が生成されるため、ファイル名のスペースが処理されます。
-0
は、ヌルで入力を分離するようにxargsに指示します。-I VAR
は、{}
ではなくVAR
を「変数名」として使用すると言います--
およびそれ以降はすべて、各行で実行するものです
これは読みやすいかもしれませんが、二重バレルコマンドを実行するたびに新しいシェルを開始します。
各ファイルを2回find
ingすることを心配している場合は、xargsを介してコマンドの組み合わせを実行すると生成されるフォークの数も気になる場合があります。
多くの場合、Perlにはこれらの基本的なシェルコマンドの多くに相当するものがあることを忘れています。これが私がこれを行う方法の1つです(テスト済み)。
find | Perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'
numericuid、gid、modeを使用する必要がありますが、これについて考えてください:これはまったくフォークしません =(find
とPerl
を超えて)。
そして、それを理解するために多くのPerlを知る必要もありません。
Chownとchmodは十分に明確です。 -d
はシェルの[
またはtest
コマンドと同じであり、3項演算子foo ? bar : baz
はPerlに固有ではありません。 (おまけとして、ディレクトリとファイルに異なるモードを使用できます。)
実際、Perlが初めての場合は、説明が必要なオプションです。少し単純化:
-n
は、「STDINの各行に対してこれを1回実行し、$_
を行に設定する」ことを意味します-l
は、各行末の改行を非表示にします(それ以外の場合は$_
の一部になるため)-e
はsed
を知っている人にはおなじみです。これは評価/実行する式であると述べています。