2009-08-13 39 views
6

Hãy xem xét hai thư mục:Đồng bộ hóa mà không quét các tệp riêng lẻ?

 
/home/user/music/flac 
/media/MUSIC/flac 

Tôi muốn thư mục thứ hai (điểm đến; một ổ đĩa USB) để chứa các tập tin tương tự và cấu trúc như thư mục đầu tiên (master). Có tổng cộng 3600 tệp (tổng cộng 59G tệp). Mỗi tệp được quét bằng cách sử dụng unison, tốc độ chậm. Tôi muốn nó so sánh dựa trên tên tệp, kích thước và thời gian sửa đổi.

Tôi nghĩ rằng rsync có thể tốt hơn nhưng các ví dụ từ trang người đàn ông khá khó hiểu và các tìm kiếm của Google không tiết lộ bất kỳ ví dụ đơn giản, sâu sắc nào. Tôi thà không vô tình xóa các tập tin trong tổng thể. ;-)

Danh sách chính sẽ thay đổi theo thời gian: các thư mục được sắp xếp lại, các tệp mới được thêm và các tệp hiện có được cập nhật (ví dụ: gắn thẻ lại). Thông thường những thay đổi là nhỏ; mất nhiều giờ để hoàn thành đồng bộ hóa tôi là phụ tối ưu.

Lệnh chính xác để đồng bộ hóa thư mục đích với thư mục chính là gì?

Lệnh sẽ sao chép tệp mới, sắp xếp lại các tệp đã di chuyển (hoặc xóa rồi sao chép) và sao chép các tệp đã thay đổi (dựa trên ngày). Các tệp đích phải có dấu thời gian được đặt thành dấu thời gian của chính.

Trả lời

6

Bạn có thể sử dụng rsync theo cách này:

rsync --delete -r -u /home/user/music/flac/* /media/MUSIC/flac 

Nó sẽ xóa các tập tin trong/media/MUSIC/flac (không bao giờ về tổng thể), và cập nhật dựa trên ngày tập tin.

Có nhiều tùy chọn hơn, nhưng tôi nghĩ cách này là đủ cho bạn. :-)

(! Tôi chỉ làm xét nghiệm đơn giản hãy kiểm tra tốt hơn!)

+1

'rsync' được thiết kế để tăng tốc các loại đồng bộ hóa này qua mạng, do đó bạn không phải gửi tất cả 59G. Nó không tăng tốc trên một máy tính cục bộ, bởi vì cả người gửi và người nhận vẫn phải đọc tất cả mọi thứ trong các cây tương ứng của họ. – caf

0

Bạn có thể sử dụng đồng bằng cũ cp để sao chép mới & tập tin thay đổi (miễn là hệ thống tập tin của bạn có timestamps làm việc):

cp -dpRuv /home/user/music/flac /media/MUSIC/ 

Để xóa tệp khỏi đích không tồn tại ở nguồn, bạn cần sử dụng tìm. Tạo một kịch bản /home/user/bin/remover.sh như vậy:

#!/bin/bash 

CANONNAME="$PWD/$(basename $1)" 
RELPATH=$(echo "$CANONNAME" | sed -e "[email protected]/media/MUSIC/flac/@@") 
SOURCENAME="/home/user/music/flac/$RELPATH" 

if [ ! -f "$SOURCENAME" ]; then 
     echo "Removing $CANONNAME" 
     rm "$CANONNAME" 
fi 

Làm cho nó thực thi, sau đó chạy nó từ find:

find /media/MUSIC/flac -type f -execdir /home/user/bin/remover.sh "{}" \; 

Điều duy nhất này sẽ không làm là loại bỏ các thư mục từ đích đã được loại bỏ trong nguồn - nếu bạn muốn điều đó, bạn sẽ phải tạo một pass thứ ba, với một sự kết hợp tìm/kịch bản tương tự.

+0

Điều này không làm việc cho tôi trong bash - Tôi thấy p (bảo tồn các thuộc tính tệp), R (đệ quy) và v (tiết) trong các trang bash man cho cp, nhưng không phải d và u. – sage

Các vấn đề liên quan