rsync excludeディレクトリが機能しない


34

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
除外パターンは機能しないと思います。
ソレン・

回答:


37

グローバルrsync大手で始まるフィルタルールが/されているアンカー転送のルートに。manページの「INCLUDE / EXCLUDE PATTERN RULES」セクションから引用:

パターンが/で始まる場合、ファイルの階層内の特定のスポットに固定されます。そうでない場合は、パス名の末尾と照合されます。これは、正規表現の先頭の^に似ています。したがって、「/ 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)マニュアルページの「包含/除外パターンのアンカー」セクションにあります


単に先頭を除外すること/は、必ずしもあなたが望むものではないことに注意してください。同じmanページセクションから再度引用:

アルゴリズムは上から下に再帰的に適用されるため、修飾されていない「foo」はツリー内の「foo」の名前と一致します。各パスコンポーネントがファイル名の最後にくるように動作します。固定されていない「sub / foo」でさえ、「sub」という名前のディレクトリ内で「foo」が見つかった階層の任意のポイントで一致します。転送のルートで一致するパターンを指定する方法の詳細については、包含/除外パターンのアンカーに関するセクションを参照してください。

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


2
重要な詳細は、スラッシュが重要であることです。ソースディレクトリの末尾にスラッシュを追加すると(rsync -a source / destination)、ソースの内容がコピーさrsync -a source destinationれます。それ以外の場合は、ソースディレクトリ自体がターゲットにコピーされます。これにより、除外式に通知するために転送のルートが決定されます。次に、exclude式での/の適切な使用について説明しました。特にrsync --exclude='/dir1' source destination何も除外しないことに注意してください。
pgoetz

11

あなたの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

2
この答えは間違っています。相対除外パスを使用すると、どこでもパターンを除外できます!
-rubo77

この投稿は正しいです。一致は、ファイルiノードベースではなくテキストベースです。--verboseコマンドの出力が示すパスが何であれ、使用する必要がある形式です。
スリダールサルノバト

これは私のために働いた。
鎮裕

ソースパスが「/」の場合、絶対パスは相対パスですが、それでも機能しません。
ソレン・

これは私のために働いた唯一のものです。
ジョナサン

2

スクリプトでこの問題が発生しました(あなたの場合はわかりません)。スクリプトでこのコマンドを使用し、bashの代わりにshを使用していたためです。スクリプトの冒頭にあるシバンを確認してください。


1

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

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

しかし、フォルダーの内容を末尾のスラッシュでrsyncするだけが良い:

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を参照して ください


0

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

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

「ben」は同期しているフォルダです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.