chmod と chown を同時に実行しますか?

chmod と chown を同時に実行しますか?

rsync 後にファイルの所有権と権限を修正するために実行しているスクリプトがあります。タスクを実行する最適な方法についての質問はさておき、同時に実行する方法があるのでしょうchmodchown?

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

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

権限と所有者/グループの両方を 1 つのコマンドで変更できたら便利だと思いました。グーグルで検索したところ、そのようなコマンド、引数、オプションは存在しないことがわかり、驚きました。

find各ファイルを 2 回実行しなくて済むように、権限と所有権の両方を同時に変更できますか?

編集コミュニティの編集や投稿などにより、この質問が重複している可能性が示唆されました。「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>

ファイルおよびディレクトリにFはプレフィックスを使用できます。--chmodD

答え3

完全性のためにxargsパイプラインでもさまざまな興味深いことを行うことができます。

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

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

-0xargsに入力をヌルで区切るように指示します。ではなく「変数名」として
-I VAR使用するように指示し、その後のすべては各行で実行するものです。VAR{}
--

これはより読みやすくなるかもしれませんが、二重コマンドを実行するたびに新しいシェルが起動されます。

答え4

各ファイルを 2 回実行することに不安がある場合はfind、xargs を介してコマンドの組み合わせを実行することで生成されるフォークの数についても心配する必要があります。

多くの人は、Perl にはこれらの基本的なシェル コマンドの多くに相当するものがあることを忘れがちです。私がこれを行う方法の 1 つを以下に示します (テスト済み)。

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

あなたは数値uid、gid、mode ですが、次の点について考えてみましょう。これは全く分岐しない(1つとfind1つを超えてperl)。

また、これを理解するために Perl について多くの知識を持つ必要もありません。

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

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

  • これは-n「STDINの各行に対してこれを1回実行し、$_行に設定する」という意味です。
  • -l各行末の改行を非表示にします(そうしないと、それが の一部になってしまうため$_)。
  • -e知っている人にはおなじみsedの、これが評価/実行する式であることがわかります。

関連情報