rsync một số tệp nhất định, ngoại trừ phần còn lại, bỏ qua thư mục .svn /, đệ quy


19

Tôi đang sử dụng rsyncđể sao chép một số tệp từ chia sẻ sang tệp khác.

Đệ quy, tôi cần:

  • Xóa các tệp tại đích đã bị xóa khỏi nguồn gốc
  • Chỉ đồng bộ hóa .php.jstập tin
  • Loại trừ mọi loại tệp khác
  • Không xóa .svn/thư mục tại đích

Nếu tôi sử dụng điều này:

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

Sau đó, rsynckhông được đệ quy vì exclude="*"loại trừ tất cả các tệp mà còn cả các thư mục.

Nếu tôi thêm --include="*/"thì .svn/thư mục sẽ bị xóa (nó cũng được bao gồm).

Làm thế nào tôi có thể giải quyết vấn đề nan giải nổ mìn này?

uname -a:

Linux tux 3.9.2-1-ARCH # 1 SMP PREEMPT Sat ngày 11 tháng 5 20:31:08 CEST 2013 x86_64 GNU / Linux

rsync phiên bản:

rsync 3.0.9-6

Câu trả lời:


13

Nỗ lực đầu tiên (không hoạt động)

Bạn cần bao gồm các thư mục bên cạnh các tệp:

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

Lần thử thứ 2

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

dữ liệu kiểm tra

Tôi đã viết kịch bản này để tạo một số dữ liệu mẫu để kiểm tra điều này. Đây là kịch bản , 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

Chạy nó tạo ra các thư mục sau:

nguồn dir

$ 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

đích đến

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

Chạy rsynclệnh trên :

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

Kết quả cuối cùng 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

Tại sao nó hoạt động?

Mấu chốt của tập lệnh này là sử dụng khả năng của bộ lọc rsync. Bộ lọc cho phép bạn xóa các tệp khỏi bộ khớp nhau tại các điểm khác nhau trong lệnh. Vì vậy, trong trường hợp của chúng tôi, chúng tôi sẽ lọc bất kỳ tệp nào khớp với mẫu */.svn*. Công cụ sửa đổi -rs_cho bộ lọc biết rằng chúng tôi muốn lọc ở cả phía nguồn cũng như phía đích.

trích từ phần LƯU Ý LỌC của trang người đàn ông của rsync

  • Một s được sử dụng để chỉ ra rằng quy tắc áp dụng cho phía gửi. Khi một quy tắc ảnh hưởng đến phía gửi, nó sẽ ngăn các tệp được chuyển. Mặc định là một quy tắc ảnh hưởng đến cả hai bên trừ khi --delete-excludedđược chỉ định, trong trường hợp đó, quy tắc mặc định chỉ trở thành phía người gửi. Xem thêm các quy tắc ẩn (H) và hiển thị (S), là một cách thay thế để chỉ định bên gửi bao gồm / loại trừ.

  • Một r được sử dụng để chỉ ra rằng quy tắc áp dụng cho bên nhận. Khi một quy tắc ảnh hưởng đến phía nhận, nó sẽ ngăn các tệp bị xóa. Xem công cụ sửa đổi để biết thêm. Xem thêm các quy tắc bảo vệ (P) và rủi ro (R), là một cách thay thế để chỉ định bao gồm / loại trừ phía người nhận.

Xem người đàn ông rsync để biết thêm chi tiết.

Mẹo để tìm ra điều này (sử dụng gợi ý --dry-run)

Trong khi mô tả cách làm điều này, tôi nghĩ rằng tôi đã đề cập đến việc --dry-runchuyển sang rsync. Nó cực kỳ hữu ích trong việc xem điều gì sẽ xảy ra mà không có rsyncsự kiện thực sự diễn ra.

Ví dụ

Sử dụng lệnh sau sẽ thực hiện chạy thử và hiển thị cho chúng tôi logic quyết định phía sau 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)

Trong đầu ra trên, bạn có thể thấy rằng các ./svnthư mục đang được bảo vệ bởi quy tắc bộ lọc của chúng tôi. Cái nhìn sâu sắc có giá trị để gỡ lỗi rsync.

Tài liệu tham khảo


Đã thử điều này, như tôi đã nói ở trên. Nếu tôi làm điều này, thì thư mục .SVN cũng được bao gồm (rất có thể đã bị xóa, vì nó không tồn tại trong nguồn gốc hoặc được sửa đổi). Điều quan trọng là không để thư mục .SVN bị ảnh hưởng. Cảm ơn vì đã thử! :)
canolucas

-C được cho là bỏ qua ".SVN /", nhưng include="*/"bao gồm nó
canolucas

Bạn đúng rồi. Nó nên .svn, chỉnh sửa câu trả lời. Dù sao, sau khi đổi tên vấn đề vẫn còn. -Cinclude="*/"dường như không phải là bạn rất thân :(
canolucas

10

Ok, sau vài lần thử tôi đã sắp xếp thứ này:

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

Cảm ơn bạn


Câu trả lời chính xác. Bộ lọc của tôi bảo vệ .svn/dirs từ --prune-empty-dirstrong trường hợp họ có sản phẩm nào. Một cách tiếp cận khác, cách này nhân đôi các thư mục trống:rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination
canolucas

Chìa khóa trong cách tiếp cận của tôi là --exclude=.svn/trước --include's
canolucas

Câu trả lời tốt là tốt. Tôi đã đề xuất loại trừ = '. Svn /' nhưng tôi nghĩ bạn muốn sử dụng -C. Vui mừng bạn đã tìm ra nó!
slm

0

Mặc dù điều này không sử dụng rsync, một tùy chọn khác là sử dụng find và cpio. Ví dụ, tôi có một thư mục có tên là Ảnh và năm và tháng.

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

Nhưng ở đây tôi có jpg, dng, xml và những thứ khác và tôi chỉ muốn jpg vì vậy tôi sẽ làm điều này

"cd" vào thư mục phía trên thư mục Ảnh sau đó:

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

Và tắt nó đi

/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

Bạn có thể sử dụng phương pháp này cho nhiều thứ, nhiều năm trước đây là cách chúng tôi sẽ sao chép / hệ thống tập tin khi di chuyển sang các đĩa lớn hơn vì nó sẽ sao chép các tập tin thiết bị.


Điều đó không trả lời câu hỏi.
RalfFriedl

Nó thực hiện nếu anh ta sử dụng: find / origin -type f (-name " .php" -o -name " .js") -print | cpio -pdmvu / Destination Chỉ các tệp * .php và * .js sẽ nằm trong thư mục đích.
lxtwin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.