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

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

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

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

ただし、~/build~/.ccachersyncによってコピーされています。何が問題なのですか?

コメント

  • 除外パターンは機能しないと思います'。

回答

グローバルrsyncの先頭の/で始まるフィルタールールはアンカーのルートにあります。転送。マニュアルページの「INCLUDE / EXCLUDEPATTERN RULES」セクションからの引用:

パターンが/で始まる場合、パターンは/に固定されます。ファイルの階層内の特定の場所。それ以外の場合は、パス名の末尾と照合されます。これは、通常の式の先頭の^に似ています。したがって、「/ foo」は、「ルート」のいずれかの「foo」の名前と一致します。 transfer」(グローバルルールの場合)またはmerge-fileのディレクトリ(の場合)ディレクトリごとのルール)。

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

  • /home/ben/.ccacheと一致させるには、/ben/.ccache
  • /home/ben/build/に一致させるには、/ben/build/

のフィルターパスが必要です。 rsync(1)のマニュアルページの「ANCHORINGINCLUDE / EXCLUDEPATTERNS」セクションにあります。


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

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

したがって、build/のフィルターパターンは、、/home/ben/many/sub/directories/build/でも。

コメント

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

回答

警告: 以下の@ 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 

コメント

  • この答えは間違っています。相対除外パスを使用すると、あらゆる場所でパターンを除外できます!
  • この投稿は正しいです。マッチングはテキストベースであり、ファイルiノードベースではありません。 --verboseコマンドの出力が示すパスが何であれ、使用する必要のある形式です。
  • これは私にとってはうまくいきました。
  • ソースパスは' / 'であり、絶対パスは相対パスですが、それでも'うまくいきません。
  • これが私のために働いた唯一のことです。

回答

/ 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

を参照してください。

回答

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

コメント

  • シェルインタープリターのシェル選択は、この特定の問題をどのように引き起こしますか?

回答

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です