rsyncで、パターンに一致するすべてのディレクトリを除外するにはどうすればよいですか?


8

rsyncで、パターンに一致するサブディレクトリを除外しようとしています。しかし、私はそれを機能させることができません。こことGoogleで見つかったいくつかの例に従っています。しかし、正しい結果が得られません。これが私のコマンドのオプションビットです:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK

私のソースディレクトリ構造は

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc

これはバックアップスクリプトの一部です。$ LNKは、前日のrsync宛先へのリンクです。

/ root / branch1、/ root / branch2、/ root / branch3は必要ありません。または同期するコンテンツ。しかし、そうです。

ここに私がすでに試した除外ビットがあります:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*

ヘルプ/アドバイスをありがとう。

編集-「重複の可能性」フラグに対処する

この質問は、ディレクトリの既知のリストに関するものです。それらのディレクトリがまだ存在しない場合でも、パターンに従うディレクトリを除外する必要があります。つまり、私の例では、名前/branch*が付けられた他のディレクトリが追加される場合があります。スクリプトを将来にわたって使用できるようにする必要があります。また、パターンに一致するディレクトリが追加されたときにスクリプトを編集しないでください。これらのディレクトリは一時的な場合があるためです。


excludeパラメータは問題ありません。コピー時にrsyncがブランチ*を無視する場合、destから削除するときにもブランチを無視するため、コピー先のこれらのディレクトリを一度に手動で削除する必要があります。
Ipor Sircer 16

宛先は、私のbashスクリプトによって作成された新しい空のディレクトリです。リンク先ディレクトリからbranch *ディレクトリを削除しましたが、役に立ちませんでした。
Roger Creasy 2016

1
あなたは次のように明示的に完全なパターンを使用する必要があります*branch*/root/branch*不足していないbranch*-短い形式が見つからないため、除外されていません。
Kondybas 2016

@Kondybasでは、excludeブランチの前に「*」を付ける必要があることを除いて、私のオプションはすべて問題ありませんか?(--exclude '*branch*
Roger Creasy 2016

回答:


2

除外ルールは正しいです。ただし、rsyncは追加のパラメーターなしで宛先の除外ファイルを削除しません--delete-excluded

--delete-excluded also delete excluded files from dest dirs

例:

#  tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

#  tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/

sent 140 bytes  received 27 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00

#  tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other

3 directories, 1 file

スクリプトのオプションを-avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNK昨夜のバックアップに変更しましたが、/ branch *ディレクトリがまだバックアップされています。
Roger Creasy 2016

1

rsyncバージョン3.1.3(おそらく以前はチェックされていない)は、この構文を使用してサブディレクトリを正しく除外します(明らかにexclude_dirname、除外するパターンに置き換えます)。

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

これはワイルドカードでも機能します。元の質問ではを使用'branch*'しているため、これは機能します。

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

お役に立てれば。

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