
ルートにファイルを移動またはコピーするときに、ファイルを移動したいディレクトリの所有者に基づいてファイルの所有権を設定したいことがよくあります。
コピーされたすべてのファイルのrsync出力を解析し、各ファイルを削除するスクリプトの作成を開始する前に、これを行うより良い/既存の方法はありますか?
tmp/ftp/new-assests/
たとえば、元のフォルダがuser_www所有の場所にフォルダをコピー/移動/同期する必要があり、ターゲットファイルとそのファイルを含む~user1/tmp/
フォルダと他のフォルダを~user2/html-stuff/
それぞれターゲットに所有させたいとします。ディレクトリに既存のファイルがあります。user1
user2
はい、ユーザーにフォルダに対する読み取り権限がある場合はファイル自体をコピーできますが、この場合は関係ありません。これらがnologinユーザーであり、ソースファイルへのアクセス権がないとしましょう(助けになる場合)。
答え1
使用rsync
:
rsync -ai --chown=user1 tmp/ftp/new-assests/ ~user1/tmp/
user1
許可されている場合は、ディレクトリを指定された場所にコピーし、ファイルの所有権を 。
パラメータの一般的な形式--chown
はありますが、上記のように特定のユーザーを所有者に設定したり、特定のグループを設定したりすることもできUSER:GROUP
ます(ユーザーIDを省略した場合、パラメータはオプションではありません)。USER
:GROUP
:
答え2
では、zsh
いつでも次のことができますroot
。
(cd tmp/ftp && tar cf - new-assests/) \
> >(USERNAME=user1; cd ~user1/tmp && tar xopf -) \
> >(USERNAME=user2; cd ~user2/html-stuff && tar xopf -)
zsh
これは2つの特定の機能を利用します。
- この設定は、
$USERNAME
シェルプロセスEUID、UID、GID、EGID、および補足gidをユーザーデータベースに基づくユーザーのEUIDに変更します(ユーザーがそのユーザー名でログインしたかのように)。ユーザーがデータベースにない場合は自動的に無視されますが、USERNAME=username
失敗しcd ~username
、サブシェルが終了します。 - 出力のためにfdを複数回リダイレクトすると(ここではstdout、2つの異なるプロセスで)、同様の動作がトリガされ、出力を2つの宛先に
tee
送信します(mult_ios
このオプションで有効、デフォルトでは有効)。これにより、ソースコードを2回読み取る時間が節約されます。
解凍tar
プロセスが終了すると、パイプライン全体が中断される可能性があります。
ksh
または、bash
ユーザー変更機能はありませんが、代わりに(使用可能な場合)またはsu
機能を使用して交換することもできます。sudo
tee
multios
(cd tmp/ftp && tar cf - new-assests/) |
tee >(cd ~user1/tmp && sudo -u user1 tar xopf -) |
(cd ~user2/html-stuff && sudo -u user2 tar xopf -)
これは、ターゲットユーザーがターゲットディレクトリへの書き込み権限を持っていると仮定します。
一部の実装には、アーカイブに保存されているファイルのユーザー名とグループ名を上書きする/または/オプションがtar
あります。したがって、別のオプションは、次のようなことを行うことです。--owner
--group
-chown
-chgrp
(cd tmp/foo && tar --owner=user1 --group="$(id -g user1)" -cf - new-assets) |
(cd ~user1/tmp && tar xpf -)
そして繰り返してくださいuser2
。
すべての場合に適用できる一貫したソリューションはないので、そのような場合にファイルにACLがある場合はどうすればよいかを検討できます。