rsync: 特定のユーザーに属さないファイルの削除を回避する

rsync: 特定のユーザーに属さないファイルの削除を回避する

私は rsync を使用して、大きな共有ドキュメント フォルダーをラップトップと同期させています。具体的には、ラップトップから共有リポジトリに rsync しています。私がやりたいのは、自分のユーザーが作成/変更したファイルのみを rsync することです。共有リポジトリなので、他の人が他のディレクトリやファイルを作成している可能性があります。

さまざまな rsync オプションを参照しましたが、探しているものが見つかりません。 または はできます--exclude--delete-excluded、ファイル名に一致するパターンのみを指定し、他のメタデータは指定できません (または、指定できますか?)。

代わりの、しかしやや面倒な解決策としては、find -not -perm $USER > excluded_filesこれらを除外して rsync などのリモート スクリプトを起動する方法がありますが、私はそれを実行したくありません。

何か案は?

更新: 明確にするために、私のラップトップ上のデータはサーバー上のデータの一部にすぎません。ここに例を示します

  • 私のラップトップにdir_1dir_2
  • 私はそれらをサーバーにrsyncしました。これでサーバーには2つのディレクトリが含まれます。
  • 別のユーザーがサーバーにログオンし、新しいディレクトリを作成するdir_3
  • ファイルを台無しにしてしまったので、もう一度rsyncを実行しますが、--deleteを使用する必要があります
  • 最初に作成したファイル、つまりdir_1とにあるファイルのみを削除したいのですdir_2が、ない dir_3

答え1

ノートパソコンにすべてのファイルのコピーを保存するのは不可能だと思います。そうでなければ、ずっと簡単になります。

ここで適切なツールはバージョン管理ツールです。しかし、すべてのユーザーが最低限の技術的知識を持っていない限り、バージョン管理ツールを使用するようにすることは現実的な提案ではないと私は認識しています。また、その場合でも、ラップトップでチェックアウトする内容を慎重に選択する必要があります。

あなたバージョン管理を引き続き使用する場合があります。共有マシンでは、自分のファイルをすべてチェックインし、他の人のファイルはそのままにしておきます。ラップトップに別のチェックアウトを保持します。マシンを切り替えるたびにコミットとチェックアウトを実行します。考えれば考えるほど、このオプションが気に入っています。コーディングや脆弱なスクリプトさえも必要ありません。


双方向の同期を行います。Rsync はこの点では不向きです。実行を忘れたり、誤って間違った方向に実行したりすると、警告なしに作業が失われる可能性があります。ユニゾン双方向同期に適したツールです。常に双方向に同期し、両側でファイルが変更された場合はエラーを出力します。オープン ソースであり、Unix と Windows の両方のプラットフォームに適切に統合されています。

残念ながら、unison には、rsync と同様に、所有者によってファイルを無視するオプションはありません。 を使用して無視リストを生成することはできますが、乱雑になり、 の実行とまたはの実行find -userの間に他のユーザーがファイルを追加または削除すると、競合状態が発生します。findunisonrsync

rsync または unison にパッチを適用して、メタデータに基づいてファイルを無視するオプションを追加できます。ソースをざっと見たところ、どちらの場合も除外コードはディレクトリ エントリではなく文字列に強く結び付けられています。実行できそうに見えますが、簡単なパッチではありません。


自分のファイルだけを含むファイルシステムのビューを作成することもできます。完全でシームレスなソリューションはありませんが、始めるためのアイデアをいくつか紹介します。

  • 共有マシンがハード リンクをサポートしている場合 (すべての Unix はサポートしており、NTFS を使用する限り Windows も NT4 以降サポートしています)、ファイルのハード リンクのみを含むリポジトリのコピーを作成するのは簡単です。

    cd /shared/repository
    find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
                                  ln "$0" "/my/view/$0"' {} \;
    

    またはzshの場合:

    autoload zmv
    zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
    

    編集や同期を行う際にハードリンクを壊さないように注意する必要があります。rsync と unison がどのように対処するかはわかりません。最初の作成後、共有リポジトリ内のあなたが所有しリンク数が 1 のファイルは削除され、あなたのビュー内のリンク数が 1 のファイルは共有リポジトリにリンクされます。これはすべて非常に不格好なので、改善の提案を歓迎します。

  • 共有マシンがサポートしている場合ヒューズ、これを使用して、自分のファイルのみを含む共有リポジトリのライブビューを作成できます。これが可能な既存のFUSEファイルシステムは知りませんが、バインドかなり近いです(コーディングの難易度を評価するためにコードを見ていません)。

  • rsync または unison を実行するときに、LD_PRELOADオーバーライド (または Windows の同等の機能) を使用して、自分が所有するファイルのみが返されるようにすることができます。readdir

関連情報