.svn /ディレクトリを無視して、残りを除く特定のファイルを再帰的にrsync


19

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 Sat May 11 20:31:08 CEST 2013 x86_64 GNU / Linux

rsync バージョン:

rsync 3.0.9-6

回答:


13

最初の試行(機能しませんでした)

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

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。フィルターを使用すると、コマンドのさまざまな時点で一致したセットからファイルを削除できます。そのため、この例では、パターンに一致するファイルをフィルタリングしています*/.svn*。修飾子-rs_は、ソース側とターゲット側の両方でフィルタリングすることをフィルターに伝えます。

rsyncのmanページのFILTER NOTESセクションからの抜粋

  • Sは、ルールが送信側に適用されることを示すために使用されます。ルールが送信側に影響する場合、ファイルが転送されないようにします。デフォルトでは、--delete-excluded指定されていない限り、ルールは両側に影響し ます。指定されていない場合、デフォルトのルールは送信者側のみになります。また、送信側の包含/除外を指定する別の方法である非表示(H)および表示(S)ルールも参照してください。

  • rは 、ルールは、受信側に適用されることを示すために使用されます。ルールが受信側に影響を与えると、ファイルが削除されなくなります。詳細については、s修飾子を参照してください。保護(P)およびリスク(R)ルールも参照してください。これらのルールは、受信側の包含/除外を指定する代替方法です。

詳細については、man rsyncを参照してください。

これを理解するためのヒント(を使用したヒント--dry-run

これを行う方法を説明している間、私はに--dry-run切り替えることに言及すると思ったrsyncrsync実際に行わなくても何が起こるかを見るのに非常に役立ちます。

例えば

次のコマンドを使用すると、テストが実行され、背後にある決定ロジックが表示され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

参照資料


上で言ったように、すでにこれを試しました。これを行うと、.SVNディレクトリも含まれます(オリジンに存在しないか、変更されているため、ほとんどの場合削除されます)。.SVNディレクトリはそのままにしておくことが重要です。とにかく試してくれてありがとう!:)
カノルカ

-Cは「.SVN /」を無視することになっていinclude="*/"ますが、それを含みます
-canolucas

あなたが正しいです。.svn答えを編集する必要があります。とにかく、問題の名前を変更した後も残ります。-Cinclude="*/"非常に親しい友人ではないようです:(
canolucas

10

OK、何度か試した後、これを整理しました:

rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' \
    --include='*/' --exclude='*' --prune-empty-dirs \
    --filter "protect .svn/" /origin /destination

ありがとうございました


素晴らしい答え。私のフィルターは、空の場合に.svn/ディレクトリを保護し--prune-empty-dirsます。別のアプローチ、これは空のdirsを複製しますrsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination
。– canolucas

私のアプローチの鍵は、--exclude=.svn/--include
カノルーカス

良い答えも。exclude = '。svn /'を提案しましたが、を使用したいと思いました-C。あなたはそれを理解してくれてうれしいです!
slm

0

これはrsyncを使用していませんが、別のオプションはfindとcpioを使用することです。たとえば、Photosというディレクトリがあり、その年と月です。

Photos
├── 2002
   ├── 2002-03
      ├── 2002-03-30
      ├── 2002-03-31
      └── 2002-03-31-02
   ├── 2002-04
      ├── 2002-04-01
      ├── 2002-04-01-03
      ├── 2002-04-07
      ├── 2002-04-21
      ├── 2002-04-22
      ├── 2002-04-22-02
      └── 2002-04-27
   ├── 2002-05
      ├── 2002-05-02
      ├── 2002-05-03

しかし、ここにはjpg、dng、xmlなどがあり、jpgだけが欲しいのでこれをやります

Photosディレクトリの上のディレクトリに「cd」してから:

find Photos -type f -name "*jpg" -print | cpio -pdmvu /fast

そしてオフ

/fast/Photos/2002/2002-04/2002-04-22/bath problem.jpg
/fast/Photos/2002/2002-04/2002-04-22-02/full bath.jpg
/fast/Photos/2002/2002-07/2002-07-10/Broken Top.jpg
/fast/Photos/2002/2002-12/2002-12-28/101-0125_IM~~G.jpg
/fast/Photos/2002/2002-12/2002-12-28/small-101-0125_IM~~G.jpg
/fast/Photos/2003/2003-01/2003-01-19/k1.jpg
/fast/Photos/2003/2003-01/2003-01-19/k2.jpg
/fast/Photos/2003/2003-02/2003-02-23/quinn.jpg
/fast/Photos/2003/2003-05/2003-05-04/all.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0015_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_2_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0007_2_r1.jpg

この方法は多くのことに使用できます。何年も前は、デバイスファイルをコピーするので、より大きなディスクに移動するときに/ファイルシステムをコピーします。


それは質問に答えません。
RalfFriedl

彼が使用する場合:find / origin -type f(-name " .php" -o -name " .js")-print | cpio -pdmvu / destination * .phpおよび* .jsファイルのみがターゲットディレクトリにあります。
lxtwin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.