ความพยายามครั้งที่หนึ่ง (ไม่ทำงาน)
คุณต้องรวมไดเรกทอรีเพิ่มเติมจากไฟล์:
rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
--exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/
ครั้งที่สอง
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
ปลายทาง dir
$ 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 afterards:
$ 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_
บอกตัวกรองว่าเราต้องการกรองทั้งด้านต้นทางและฝั่งเป้าหมาย
ตัดตอนมาจากส่วน FILTER NOTES ของ man page ของ rsync
sถูกนำมาใช้เพื่อแสดงให้เห็นว่ากฎนำไปใช้ในด้านการส่ง เมื่อกฎส่งผลกระทบต่อด้านการส่งมันจะป้องกันไม่ให้ไฟล์ถูกถ่ายโอน ค่าเริ่มต้นสำหรับกฎที่จะส่งผลกระทบต่อทั้งสองฝ่ายเว้นแต่ว่า
--delete-excluded
มีการระบุไว้ในกรณีนี้กฎเริ่มต้นจะกลายเป็นฝั่งผู้ส่ง ดูเพิ่มเติมที่กฎซ่อน (H) และการแสดง (S) ซึ่งเป็นอีกวิธีหนึ่งในการระบุการรวม / แยกด้านส่ง
R ถูกนำมาใช้เพื่อแสดงให้เห็นว่ากฎนำไปใช้ในด้านการรับ เมื่อกฎมีผลกระทบกับด้านการรับมันจะป้องกันไฟล์จากการถูกลบ ดูตัวแก้ไข s สำหรับข้อมูลเพิ่มเติม ดูเพิ่มเติมที่กฎการป้องกัน (P) และความเสี่ยง (R) ซึ่งเป็นอีกวิธีหนึ่งในการระบุการรวม / ไม่รวมตัวรับสัญญาณ
ดูman rsyncสำหรับรายละเอียดเพิ่มเติม
เคล็ดลับในการหาสิ่งนี้ (แนะนำโดยใช้--dry-run
)
ในขณะที่การอธิบายวิธีการทำเช่นนี้ฉันคิดว่าฉันพูดถึงการสลับไป--dry-run
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
ข้อมูลเชิงลึกที่มีคุณค่าสำหรับการแก้จุดบกพร่อง
อ้างอิง