いくつかのファイルをrsyncし、残りを除いて、.svn/ディレクトリを再帰的に無視します。

いくつかのファイルをrsyncし、残りを除いて、.svn/ディレクトリを再帰的に無視します。

rsync共有の一部のファイルを別の共有にコピーするために使用します。

再帰的には次のものが必要です。

  • 元の場所から削除された宛先の場所からファイルを削除する
  • 同期.php.jsファイルのみ
  • 他のすべてのファイル形式を除外
  • .svn/ターゲットディレクトリを削除しないでください

私がこれを使用している場合:

rsync -zavC --delete --include='*.php' --include='*.js' --exclude="*" \
    /origin /destination

すべてのファイルとフォルダが除外されるため、再帰的でrsyncはありません。exclude="*"

追加すると、--include="*/"ディレクトリ.svn/が削除されます(また含まれます)。

この胸痛のジレンマをどのように解決できますか?

uname -a:

Linux tux 3.9.2-1-ARCH #1 SMP PREEMPT 5月11日 土曜日 20:31:08 CEST 2013 x86_64 GNU/Linux

rsyncバージョン:

rsync 3.0.9-6

ベストアンサー1

最初の試み(失敗)

ファイルに加えて、次のディレクトリも含める必要があります。

rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
     --exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/

2回目の試み

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/

テストデータ

これをテストするために、いくつかのサンプルデータを生成するためにこのスクリプトを作成しました。スクリプトは次のとおりですsetup_svn_sample.bash

#!/bin/bash

# setup .svn dirs
mkdir -p dir{1,2}/dir{1,2,3,4}/.svn

# fake data under .svn
mkdir -p dir1/dir{1,2,3,4}/.svn/origdir
mkdir -p dir2/dir{1,2,3,4}/.svn/keepdir

# files to not sync
touch dir1/dir{1,2,3,4}/file{1,2}

# files to sync
touch dir1/dir{1,2,3,4}/file1.js
touch dir1/dir{1,2,3,4}/file1.php

これを実行すると、次のディレクトリが作成されます。

ソースディレクトリ

$ tree -a dir1
dir1
|-- dir1
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir2
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir3
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
`-- dir4
    |-- file1
    |-- file1.js
    |-- file1.php
    |-- file2
    `-- .svn
        `-- origdir

宛先ディレクトリ

$ tree -a dir2
dir2
|-- dir1
|   `-- .svn
|       `-- keepdir
|-- dir2
|   `-- .svn
|       `-- keepdir
|-- dir3
|   `-- .svn
|       `-- keepdir
`-- dir4
    `-- .svn
        `-- keepdir

上記のrsyncコマンドを実行します。

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
dir1/file1.js
dir1/file1.php
dir2/file1.js
dir2/file1.php
dir3/file1.js
dir3/file1.php
dir4/file1.js
dir4/file1.php

sent 480 bytes  received 168 bytes  1296.00 bytes/sec
total size is 0  speedup is 0.00

後で作成された dir2:

$ tree -a dir2
dir2
|-- dir1
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir2
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir3
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
`-- dir4
    |-- file1.js
    |-- file1.php
    `-- .svn
        `-- keepdir

なぜ動作しますか?

スクリプトの重要な部分は、rsync.filtersを活用して、コマンドのさまざまな時点で一致セットからファイルを削除できるようにすることです。したがって、私たちの場合は、パターンに一致するすべてのファイルをフィルタリングします*/.svn*。修飾子は、-rs_ソース側とターゲット側の両方でフィルタリングしたいとフィルタに通知します。

rsyncのマニュアルページのFILTER NOTESセクションで

  • 一つSルールが送信者に適用されることを示すために使用されます。ルールが送信者に影響を与えると、ファイル転送がブロックされます。デフォルトルールは、指定されていない限り両方のパーティに影響を与えます。 --delete-excludedこの場合、デフォルトルールは送信者にのみ適用されます。送信者の埋め込み/除外を指定する別の方法である非表示(H)および表示(S)の規則も参照してください。

  • 一つアル字型 ルールが受信者に適用されることを示すために使用されます。ルールが受信者に影響を与える場合、ファイルは削除されません。詳細については、s修飾子を参照してください。受信者の包含/除外を指定する別の方法である保護(P)およびリスク(R)の規則も参照してください。

バラより人の同期詳細については。

この問題を解決するためのヒント(使用上のヒント--dry-run

これを行う方法を説明するときは、--dry-runSwitch toについて言及する必要があると思いました。これは実際には起こらず、rsync何が起こるのかを知るのに非常に便利です。rsync

例えば

次のコマンドを使用すると、テスト実行が実行され、その後にある意思決定ロジックが表示されますrsync

rsync --dry-run -avvzC --filter='-rs_*/.svn*' --include="*/" \
     --include='*.js' --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
[sender] showing directory dir3 because of pattern */
[sender] showing directory dir2 because of pattern */
[sender] showing directory dir4 because of pattern */
[sender] showing directory dir1 because of pattern */
[sender] hiding file dir1/file1 because of pattern *
[sender] showing file dir1/file1.js because of pattern *.js
[sender] hiding file dir1/file2 because of pattern *
[sender] showing file dir1/file1.php because of pattern *.php
[sender] hiding directory dir1/.svn because of pattern */.svn*
[sender] hiding file dir2/file1 because of pattern *
[sender] showing file dir2/file1.js because of pattern *.js
[sender] hiding file dir2/file2 because of pattern *
[sender] showing file dir2/file1.php because of pattern *.php
[sender] hiding directory dir2/.svn because of pattern */.svn*
[sender] hiding file dir3/file1 because of pattern *
[sender] showing file dir3/file1.js because of pattern *.js
[sender] hiding file dir3/file2 because of pattern *
[sender] showing file dir3/file1.php because of pattern *.php
[sender] hiding directory dir3/.svn because of pattern */.svn*
[sender] hiding file dir4/file1 because of pattern *
[sender] showing file dir4/file1.js because of pattern *.js
[sender] hiding file dir4/file2 because of pattern *
[sender] showing file dir4/file1.php because of pattern *.php
[sender] hiding directory dir4/.svn because of pattern */.svn*
delta-transmission disabled for local transfer or --whole-file
[generator] risking directory dir3 because of pattern */
[generator] risking directory dir2 because of pattern */
[generator] risking directory dir4 because of pattern */
[generator] risking directory dir1 because of pattern */
[generator] protecting directory dir1/.svn because of pattern */.svn*
dir1/file1.js
dir1/file1.php
[generator] protecting directory dir2/.svn because of pattern */.svn*
dir2/file1.js
dir2/file1.php
[generator] protecting directory dir3/.svn because of pattern */.svn*
dir3/file1.js
dir3/file1.php
[generator] protecting directory dir4/.svn because of pattern */.svn*
dir4/file1.js
dir4/file1.php
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 231 bytes  received 55 bytes  572.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

上記の出力から、./svnディレクトリがフィルタリング規則によって保護されていることがわかります。デバッグ用rsync

引用する

おすすめ記事