web-dev-qa-db-ja.com

名前にスペースが含まれているディレクトリツリーのrsyncexcludeを作成するにはどうすればよいですか?

rsyncスクリプトに埋め込まれたbashコマンドの一部としてディレクトリツリーを次のように除外しようとしています。

$OPTIONS="-rl --exclude 'Some Parent Directory/Another Directory'"

rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir

私の目的は、$SOURCEDIRの下にあるすべてのものを除いて、ターゲットマシン上のすべての/SomeTargetDirSome Parent Directory/Another Directoryに同期することです。ただし、次の形式のエラーが表示され続けます。

rsync: link_stat "/Users/myusername/Parent\" failed: No such file or directory (2)

これは除外パスのエスケープに関連していると思いますが、正しく理解できないようです。\\\などのすべての組み合わせが正しくないようです。除外ルールを正しく作成するにはどうすればよいですか?

どうしても必要な場合を除いて、--exclude-fromは使いたくありません。

OS X 10.8でrsyncバージョン3.0.9を使用しており、SSH経由でUbuntu12.04に同期しています。

2
Andrew Ferrier

使用する --exclude-from。除外ファイルにはすべてのパターンが改行され、引用符、エスケープ、スペースの問題を忘れることができます。

私はあなたと同じようなスクリプトを持っています、そしてこれは私がしたことです。このソリューションでは、スクリプトで除外ファイルを生成しているため、引用符が正しいことを確認する必要があることに注意してください。静的除外ファイルを作成できる場合は、さらに簡単になります。

# create a temporary file
RSYNC_EXCLUDES=$( mktemp -t rsync-excludes )
# remove the temp file when the script exits
trap "rm -f $RSYNC_EXCLUDES" EXIT
# populate the exclusion file
echo 'Some Parent Directory/Another Directory' > "$RSYNC_EXCLUDES"
# have your options point to your exclusion file
$OPTIONS="-rl --exclude-from='$RSYNC_EXCLUDES'"
# profit
rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir
1
djjeck

一致パターンも除外します。したがって、次のように試してください。

$OPTIONS="-rl --exclude '*/Another Directory'"
rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir

詳細については、これを参照してください チュートリアル

編集#1

もう1つの提案は、一重引用符を使用するのではなく、二重引用符をエスケープすることです。

$OPTIONS="-rl --exclude \"Some Parent\ Directory/Another\ Directory\""

OPはこの代替案を試しましたが、彼の場合はまだ機能しませんでした。 rsyncのバージョン「3.0.8プロトコルバージョン30」を使用するLinuxでは動作します。

1
slm