rsync:権限のないファイルをスキップします


16

rsync -rlptD別のユーザーからディレクトリをコピーするために使用しています。コピーする権限がないファイルがいくつかあります(これらを事前に知る方法はありません)。rsyncがこれらを無視する方法はありますか?問題は、rsyncがゼロ以外を返すと、bash -xスクリプトが終了することです。


Rsyncには、終了値が十分に文書化されています。あなたの状況がそれが失敗であるように要求しないなら、あなたはそれらのすべてを失敗として扱うべきではありません。
ヨルダン

@jordanmしかし、このエラーのみを特定するのに十分な具体的なエラーコードはありません。
ジル「SO-悪であるのをやめる」

回答:


7

Rsyncにはこのオプションはありません。2つの解決策があります。1つは、rsyncエラーメッセージを解析することです。これはあまり堅牢ではありません。もう1つは、読み取り不可能なファイルのリストを生成してフィルタリングすることです。

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

場合は、あなたがfind持っていない-readable-executable、適切でそれらを交換-permディレクティブ。

これは、名前に改行が含まれる読み取り不能ファイルがないことを前提としています。これらに対処する必要がある場合は、このようなヌル区切りのファイルリストを作成し、-0オプションをrsync次のように渡す必要があります。

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

これはおそらく彼の最善策です。stat()すべてのファイルを2回(rsyncを介して1回、findを介して1回)実行する必要があるため、これを1回実行するだけで十分です。
ヨルダン

@Gillesは、隠しファイルを除いて機能するようです。同じ戦略が若干の微調整で機能すると仮定しています。私は\に精通していません!(感嘆符をスラッシュ)それを説明できますか?
ジェフチャーター

1
@JeffC \!は、!演算子を引用してシェル拡張から保護します。バックスラッシュは実際には必要あり!ません。これは、スペースが続いたときにシェルが展開されないためです。しかし、傷はありません。隠しファイルの何が問題になっていますか?
ジル「SO-悪であるのをやめる」

2

この特定の状況に対して簡単な回避策を作成しました。

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

これは0、返されたコードが0または23の場合に戻り、その他の場合は終了コードを返します。

ただし、これはPartial transfer due to errorコードを終了するすべてをキャッチするため、許可エラーだけでなくすべてのエラーを無視することに注意することが重要です23。rsyncステータスコードの詳細については、このリンクを参照してください

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