rsync: bỏ qua các tệp mà tôi không có quyền


16

Tôi đang sử dụng rsync -rlptDđể sao chép một thư mục từ người dùng khác. Có một vài tệp (tôi không có cách nào biết trước những tệp này) mà tôi không được phép sao chép. Có cách nào để rsync bỏ qua những điều này. Vấn đề là nếu rsync trả về khác không, tập lệnh bash -x của tôi sẽ thoát.


Rsync có giá trị thoát tài liệu tốt. Bạn không nên coi tất cả chúng là một thất bại nếu tình huống của bạn không gọi đó là một thất bại.
jordanm

@jordanm Nhưng không có mã lỗi nào đủ cụ thể để chỉ xác định lỗi này.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


7

Rsync không có tùy chọn cho việc này. Tôi thấy hai giải pháp. Một là phân tích các thông báo lỗi rsync; Điều này không phải là rất mạnh mẽ. Hai là để tạo một danh sách các tập tin không thể đọc được để lọc.

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

Nếu bạn findkhông có -readable-executable, thay thế chúng bằng -permchỉ thị thích hợp .

Điều này giả định rằng không có tệp không thể đọc được có tên chứa dòng mới. Nếu bạn cần đối phó với những thứ đó, bạn sẽ cần tạo một danh sách tệp được phân tách bằng null như thế này và chuyển -0tùy chọn tới rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

Đây có lẽ là đặt cược tốt nhất của anh ấy. Hy vọng, anh ta chỉ cần chạy cái này một lần, vì phải gửi stat()mọi tệp hai lần (một lần qua rsync và một lần qua find) sẽ khá tệ.
jordanm

@Gilles này dường như hoạt động, ngoại trừ các tập tin ẩn. Tôi giả sử chiến lược tương tự sẽ hoạt động với một số điều chỉnh nhỏ. Tôi không quen với \! (dấu chấm than) bạn có thể giải thích điều đó?
JeffCharter

1
@JeffC \!trích dẫn !toán tử để bảo vệ nó chống lại sự mở rộng vỏ. Dấu gạch chéo ngược thực sự không cần thiết ở đây vì không có vỏ mở rộng !khi nó đi theo khoảng trắng, nhưng nó không bị tổn thương. Có gì sai với các tập tin ẩn?
Gilles 'SO- ngừng trở nên xấu xa'

2

Tôi đã thực hiện một cách giải quyết đơn giản cho tình huống cụ thể này:

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

Điều này trả về 0nếu mã được trả về là 0 hoặc 23 và trả về mã thoát trong tất cả các trường hợp khác.

Tuy nhiên, điều quan trọng cần lưu ý là điều này sẽ bỏ qua tất cả các Partial transfer due to errorlỗi, không chỉ các quyền , vì nó sẽ bắt mọi thứ thoát khỏi mã 23. Để biết thêm thông tin về mã trạng thái rsync, vui lòng tham khảo liên kết này .

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.