
rsync 後にファイルの所有権と権限を修正するために実行しているスクリプトがあります。タスクを実行する最適な方法についての質問はさておき、同時に実行する方法があるのでしょうchmod
かchown
?
私のスクリプトの現在の反復では、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
はプレフィックスを使用できます。--chmod
D
答え3
完全性のために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
{}
--
これはより読みやすくなるかもしれませんが、二重コマンドを実行するたびに新しいシェルが起動されます。
答え4
各ファイルを 2 回実行することに不安がある場合はfind
、xargs を介してコマンドの組み合わせを実行することで生成されるフォークの数についても心配する必要があります。
多くの人は、Perl にはこれらの基本的なシェル コマンドの多くに相当するものがあることを忘れがちです。私がこれを行う方法の 1 つを以下に示します (テスト済み)。
find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'
あなたは数値uid、gid、mode ですが、次の点について考えてみましょう。これは全く分岐しない(1つとfind
1つを超えてperl
)。
また、これを理解するために Perl について多くの知識を持つ必要もありません。
chown と chmod は十分に明確です。 は シェルのまたはコマンド-d
と同じであり、三項演算子はperl に固有のものではありません。([
test
foo ? bar : baz
ボーナスとして、ディレクトリとファイルに異なるモードを使用できます。
実際、Perl を初めて使用する場合は、オプションの説明が必要になる場合があります。少し簡略化します。
- これは
-n
「STDINの各行に対してこれを1回実行し、$_
行に設定する」という意味です。 -l
各行末の改行を非表示にします(そうしないと、それが の一部になってしまうため$_
)。-e
知っている人にはおなじみsed
の、これが評価/実行する式であることがわかります。