rsync除外ディレクトリは機能しません。

rsync除外ディレクトリは機能しません。

Fedora 17 64ビットを実行していますが、rsync --exclude=/home/ben/<dir>期待どおりに機能しません。

私のホームディレクトリをサムドライブにコピーしようとしていますが、rsyncキャッシュファイルとビルドファイルを保持する特定のディレクトリを除外したいと思います。これは私が使用するコマンドです:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

~/buildただし、 の内容はコピー~/.ccacheされていますrsync。私は何が間違っていましたか?

答え1

rsync先行で始まるグローバルフィルタリングルールは次/のとおりです。固定転送のルートに。マニュアルページの「パターンルールの埋め込み/除外」セクションを引用すると、次のようになります。

パターンが / で始まる場合はファイル階層の特定の場所に固定され、そうでない場合はパス名の末尾と一致します。これは正規表現の前にある^に似ています。したがって、「/foo」は、「転送ルート」(グローバルルールの場合)またはマージされたファイルディレクトリ(ディレクトリ固有のルールの場合)の「foo」名と一致します。

コマンド(rsync ... -arv /home/ben home-ben/)でファイルは/home/ben/fooに転送されますhome-ben/ben/foo。転送ルートはhome-ben、正しいフィルタパスはです/ben/foo。したがって、

  • 一致させるには/home/ben/.ccacheフィルタパスが必要です。/ben/.ccache
  • 一致させるには/home/ben/build/フィルタパスが必要です。/ben/build/

詳細な説明は、「アンカー埋め込み/除外パターン」セクションで確認できます。rsync(1)マニュアルページ


単に先行を省略することは/必ずしも望むわけではありません。同じマニュアルページセクションを再引用すると、次のようになります。

正規化されていない「foo」は、アルゴリズムが上から下に再帰的に適用されるため、ツリー内のどの場所でも「foo」名と一致します。各パスコンポーネントがファイル名の終わりであるかのように動作します。固定されていない「sub / foo」でも、「sub」というディレクトリに「foo」が見つかった階層のすべてのポイントと一致します。トランスポートルートで一致させるパターンを指定する方法の詳細については、「アンカー埋め込み/除外パターン」のセクションを参照してください。

したがって、フィルタパターンはbuild/ビルドディレクトリの任意の場所で一致します。/home/ben/home/ben/many/sub/directories/build/

答え2

警告する: 以下の@rubo77の説明によると、この答えはルートディレクトリだけでなく、ソースツリー内のすべての場所からこれらのエントリを除外したい場合にのみ使用する必要があります。詳細については、上記の@jw013の回答を参照してください。

excludeあなたのパスはソースパスに相対的でなければならないと思います。これを試すことができますか?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

比較のためのテストは次のとおりです。

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

答え3

完全な/homeパスをrsyncすると(つまり、末尾のスラッシュなしで)除外パターンが機能します。

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

ただし、後にスラッシュを使用してフォルダの内容のみを再同期することをお勧めします。

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

無視リストを使用することもできます。以下を参照してください。 https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

答え4

特定のフォルダを除外するには、rsyncコマンドで相対パスを考慮する必要があります。あなたの場合:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

ここで、「ben」は同期するフォルダです。

関連情報