rsyncで複数のディレクトリを除外するにはどうすればよいですか?


184

rsyncを使用してホームディレクトリをバックアップしようとしていますが、迷惑メールを含むディレクトリの一部を除外したいです。とを特に除外/home/ben/.ccache/home/ben/buildます。残念ながら、rsyncのドキュメントは情報過多であり、私の質問には答えませんでした。これは私が試したものです:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

これを行う正しい方法は何ですか?


4
フラグarすでに意味することを言いたかっただけです:)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
ポプラ

回答:


238

OK この質問を投稿する前に、友人がその方法を教えてくれました。これは本当に簡単です。複数のディレクトリを除外するには、複数の--exclude=pathスイッチを使用します。したがって、適切に記述された上記の私のコマンドは次のとおりです。

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

7
絶対パスではなかったではないソースディレクトリからの相対パスが正しく働いていたのに対し、(指定したディレクトリは黙って除外されなかった)私のために働きます。何かが足りないかもしれませんが、絶対パスが常に機能するという@FreeSoftwareServersの主張には注意が必要です。
ソレンBjornstad

5
参考までに、このオプション-aには冗長性が含まれ-r-arいます。
デビッド

4
FreeSoftwareServersが信じていることとは反対に、除外パスは/ではなくソースパスに相対的です。そのため、そのコメントはカテゴリー的に偽であり、それに従うと失敗につながります。最良の戦略は、このタイプのメンタルエラーを回避するために、除外の先頭/を除外することです。sourceが/ home / meで、exclude = '/ mydir /'の場合、これは/ home / meのディレクトリmydirを除外します。つまり、/の/ mydir /ではなく/ home / me / mydirを除外します。残念ながら、そのコメントは技術的に間違っており、誤解を招く可能性があるため、そのコメントをダウン票または編集することはできません。
リザード

3
後の旅行者の参考までに、@ FreeSoftwareServerによる問題のコメントは削除されたようです。tl; dr:相対パスを使用
Freedom_Ben

2
あなたが愚かであるなら、私と他の179人のアップボルターもそうです!
シュリダールSarnobat

108

複数のディレクトリやファイルを除外する場合は、テキストファイルを作成して--exclude-fromスイッチを使用します。というファイルを作成し、そのファイルにexclude_me.txt除外をリストします。例(/home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

次に、rsyncは次のようになります。

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

これは、役立つ可能性のあるフィルター規則に関する情報です。

  • /dir/ ルートフォルダーを除外することを意味します /dir
  • /dir/*ルートフォルダを取得する/dirが、コンテンツは取得しないことを意味します
  • dir/ 名前に含まれるすべてのフォルダを除外することを意味します dir/

  • 除外される例:内の任意のフォルダー内/dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfで始まるファイルをスキップすることを意味しcfます/var/spool/lpd

manページのフィルター規則セクションも参照してください。


4
ルートフォルダーはルートディレクトリではなく転送ルートを意味することに注意することが重要です。
ジェームズリン

これは素晴らしい答えです!
アレクサンダージューコフ

85

中括弧内の複数のパスを除外することもできます。

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/

40
これは、私が「ハードな方法」を発見だけではbashの下で、だけではないのshの下で、うまく動作
排他的論理和を

7
コンマの後にスペースはありません。あまりにも😭そのハードな方法を学んだ
styl3r

--exclude = '。gvfs'のように ''を使用しないでください
Martin T.

FWIW、中括弧はkshで機能すると思います。他のシェルでは、次のようなものを使用できますIFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/。または、複数の--exclude引数を使用するだけで、手動で入力する必要があります。
TSJNachos117

1
これが機能する理由は、誰かが詳細を確認したい場合に備えて、「ブレース拡張」のためです。
shredalert
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.