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-run
Switch 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
。
引用する
答え2
いいですね。何度も試した後に問題を解決しました。
rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' \
--include='*/' --exclude='*' --prune-empty-dirs \
--filter "protect .svn/" /origin /destination
ありがとう
答え3
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
このアプローチは、多くの用途に使用できます。数年前はデバイスファイルをコピーしたので、大きなディスクに移動したときに/ファイルシステムをコピーする方法でした。