Tôi có thể sử dụng rsync để tạo danh sách các tệp chỉ thay đổi không?


26

Tôi đang sử dụng rsync trong tập lệnh bash để giữ các tệp đồng bộ giữa một vài máy chủ và NAS. Một vấn đề tôi gặp phải là cố gắng tạo danh sách các tệp đã thay đổi trong thời gian rsync.

Ý tưởng là khi tôi chạy rsync, tôi có thể sản xuất các tập tin đã thay đổi vào một tập tin văn bản - hy vọng hơn cho một mảng trong bộ nhớ - sau đó trước khi kịch bản tồn tại tôi có thể chạy một chown trên chỉ các tập tin đã thay đổi.

Có ai tìm thấy một cách để thực hiện một nhiệm vụ như vậy?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done

→ xem anwer của tôi ở đây . Cũng -iđể chia thành từng mục, nhưng với một vài vòng xoắn nữa ...
Frank Nocke

Câu trả lời:


42

Bạn có thể sử dụng tùy chọn rsync --itemize-changes( -i) để tạo đầu ra có thể phân tích cú pháp giống như sau:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

>tự ở vị trí đầu tiên cho biết một tệp đã được cập nhật, các ký tự còn lại cho biết lý do tại sao, ví dụ ở đây stcho biết kích thước tệp và dấu thời gian đã thay đổi.

Một cách nhanh chóng và bẩn để có được danh sách tập tin có thể là:

rsync -ai src/ dest/ | egrep '^>'

Rõ ràng phân tích cú pháp nâng cao hơn có thể tạo ra đầu ra sạch hơn :-)

Tôi đã xem qua liên kết tuyệt vời này trong khi cố gắng tìm hiểu khi nào --itemize-changesđược giới thiệu, rất hữu ích:

http://andreafrancia.it/2010/03/under Hiểu-the-output-of-rsync-itemize -changes.html (liên kết lưu trữ)


2
Đối với một đầu ra sạch hơn như đã đề cập, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runsẽ chỉ liệt kê các tệp đã sửa đổi ( các tổng kiểm tra khác nhau ), chắc chắn là một trình quản lý, thx :) FYI đặt --dry-runsau lệnh thay vì sử dụng ntùy chọn là cách tốt nhất cho tôi
MediaVince

Về cơ bản giống như rsync -zavc src/ dest/ --dry-runkhông có verbose
MediaVince

14

Sử dụng -ncờ, kết hợp với -ccờ tổng kiểm tra và -icờ:

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

Trong ví dụ này, chỉ có một tệp đã thay đổi, dựa trên nội dung của chính tệp đó. Tuy nhiên, không có đồng bộ hóa tập tin được thực hiện vì -ncờ

Tiền thưởng

Nếu bạn muốn chạy chown trên các tệp đã thay đổi, hãy phân tích chúng bằng sedhoặc tương tự và xử lý với xargs, ví dụ:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
MUY Bỉ

-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner

Tôi không theo dõi. Tất cả 3 tệp trong ví dụ này được đánh dấu '> fcst' mà tôi hiểu có nghĩa là 'được nhận từ xa', tổng kiểm tra khác nhau, kích thước khác nhau, thời gian khác nhau. Điều gì ở đầu ra chỉ ra rằng "chỉ có một tệp đã thay đổi" ??
bobpaul

1

Câu hỏi này hơi cũ, nhưng tôi nghĩ nó đáng để thêm vào:

-i là một phím tắt của --out-format=%i%n%L

%ncó nghĩa là tên tệp, (phần log formatcủa man rsyncd.conf)

Phiên bản PS rsync 3.1.0


Trên thực tế câu trả lời này đã đề cập đến tùy chọn đó
Cychih
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.