Làm thế nào để loại trừ các thư mục số với rsync?


8

Tôi biết rsync có một --excludetùy chọn mà tôi sử dụng khá thường xuyên. Nhưng làm thế nào tôi có thể chỉ định rằng nó nên loại trừ tất cả các thư mục "số"?

Trong danh sách thư mục dưới đây tôi muốn chỉ có nó sao chép css, htmlinclude

.
..
123414
42344523
345343
2323
css
html
include

Thông thường cú pháp của tôi là một cái gì đó như

rsync -avz /local/path/ user@server:/remote/path/ --exclude="cache"

Tôi nghĩ rằng nó sẽ trông giống như thế --exclude="[0-9]*"nhưng tôi không nghĩ rằng nó sẽ làm việc.

Câu trả lời:


6

Tùy chọn loại trừ của rsync không thực sự hỗ trợ regex, nó phù hợp hơn với mô hình khớp nối vỏ.

Nếu các thư mục đó khá tĩnh, bạn chỉ nên liệt kê chúng trong một tệp và sử dụng --exclude-from=/full/path/to/file/exclude_directories.txt.

Cập nhật để cung cấp ví dụ

Đầu tiên, bạn chỉ cần đặt các thư mục vào một tập tin:

find . -type d -regex '.*/[0-9]*$' -print > /tmp/rsync-dir-exlcusions.txt

hoặc là

( cat <<EOT
123414
42344523
345343
2323
EOT ) > /tmp/rsync-directory-exclusions.txt

sau đó bạn có thể thực hiện công việc rsync của mình:

rsync -avHp --exclude-from=/tmp/rsync-directory-exclusions.txt /path/to/source/ /path/to/dest/

Bạn chỉ cần thêm một bước để thiết lập tệp văn bản có chứa các thư mục để loại trừ, 1 trên mỗi dòng.

Hãy nhớ rằng đường dẫn của các thư mục trong công việc, là đường dẫn tương đối của chúng đến cách rsync nhìn thấy thư mục.


2
Bạn có thể sử dụng tập lệnh sử dụng biểu thức chính quy để tạo tệp này trước khi chạy rsync
Rory Alsop

Bạn có thể đưa ra một ví dụ như một câu trả lời?
cwd

vừa cập nhật để bao gồm một ví dụ, bao gồm cả những gì @RoryAlsop đề xuất kết hợp với những gì thiton đề xuất bên dưới.
Tim Kennedy

@TimKennedy Trong tệp chứa loại trừ, rsync hiểu thay đổi dòng hoặc không gian là đủ?
Abhinav

@Abhinav rsynchiểu một mục nhập trên mỗi dòng. không gian sẽ không hoạt động.
Tim Kennedy

7

Bạn không thể nói tên một tên chỉ chứa các chữ số trong cú pháp mẫu của rsync. Vì vậy, bao gồm tất cả các tên có chứa một chữ số và loại trừ phần còn lại.

rsync --include='*[!0-9]*' --exclude='*/' …

Xem thêm hướng dẫn mẫu rsync của tôi .


2

Bạn có thể làm điều đó trong một dòng:

rsync -avHp --exclude-from=<(cd /path/to/source; find . -type d -regex './[0-9]*' | sed -e 's|./||') /path/to/source/ /path/to/dest/

2
Haa sức mạnh của vỏ :)
Ludovic Kuty

1

Sử dụng find để tạo danh sách các thư mục cần loại trừ, sau đó sử dụng tùy chọn --exclude-from của rsync như Tim Kennedy đã mô tả.


-1

Sử dụng lệnh này:

$> rsync -avlH --exclude=*.ibd --exclude-from=<(ls -p | grep -v / | \
   grep -E 'ibdata|ib_logfile')  /mnt/myfuse/ /u01/my3309/data/

Không bao gồm các tệp InnoDB - không phải các thư mục số.
Anthony Geoghegan
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.