Rsync: chỉ sao chép qua dấu thời gian


42

Hiện tại tôi có hai thư mục A / và B / giống nhau về mọi khía cạnh, ngoại trừ dấu thời gian. Vì vậy, nếu tôi chạy lệnh:

rsync --dry-run -crvv A/ B/

sau đó tất cả các tệp được đánh dấu "nâng cấp", trong khi lệnh:

rsync --dry-run -rvv A/ B/

cho thấy rằng tất cả các tệp sẽ được sao chép từ A / sang B /.

Câu hỏi của tôi là: vì tôi biết các tệp giống hệt nhau (liên quan đến nội dung), sau đó có cách nào (thông qua rsync hoặc cách khác) để đặt dấu thời gian cho các tệp trong B / giống hệt với dấu thời gian của tệp trong A /, mà không sao chép tất cả các tệp từ A / sang B /?

Cảm ơn


Nếu bạn biết các tập tin giống hệt nhau, thì tại sao bạn phải đi ra ngoài để không sao chép chúng để có được dấu ngày / thời gian bạn yêu cầu?
Tim

3
@Tim: có thể có rất nhiều dữ liệu.
Richard

Câu trả lời:


75

Sử dụng -t(bảo toàn dấu thời gian) và --size-onlysẽ chỉ so sánh các tệp về kích thước. Nếu kích thước khớp, rsync sẽ không sao chép tệp nhưng vì -tđược chỉ định, nó sẽ cập nhật dấu thời gian trên tệp đích mà không cần sao chép lại.

Đảm bảo không sử dụng -u(cập nhật) vì điều này sẽ bỏ qua các tệp đã tồn tại và hoàn toàn bỏ qua việc cập nhật dấu thời gian.

Tôi gặp vấn đề ban đầu là không sử dụng rsync để sao chép một loạt các tệp vào ổ đĩa mới và do đó dấu thời gian đã được cập nhật theo thời gian hiện tại. Tôi đã sử dụng lệnh dưới đây để đồng bộ hóa mọi thứ chính xác trong một khoảng thời gian hợp lý:

rsync -vrt --size-only /src /dest

2
Tôi cũng đề nghị thêm --existingđể ngăn chặn các bản sao ngẫu nhiên của các tệp mới.
leden

1
Lá cờ --archive(hoặc -a) bao gồm -r, -tvà nhiều hơn nữa :)
Dor

6

Chỉ sử dụng --size sẽ khiến rsync bỏ qua việc so sánh dấu thời gian của tệp (và do đó là nội dung tệp) nếu kích thước khớp với nhau. Kết hợp điều này với --times sẽ nhân bản dấu thời gian ngang qua cây mục tiêu.


3

Tôi nghĩ rsync là công cụ phù hợp để thực hiện điều này nhưng nếu bạn muốn một số tập lệnh thực hiện điều này hơn là đôi khi điều này có thể mang lại một khởi đầu tốt.

Bạn có thể nhận được danh sách tệp có dấu thời gian (số lần truy cập) như thế này:

find . -printf '"%p" %a\n' -type f > /tmp/times

Và nhận các lệnh cập nhật thời gian thích hợp từ nó:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Nó không phải là một kịch bản hoàn chỉnh mà là một khởi đầu tốt! :)


Cảm ơn. Tôi nghĩ rằng tôi có thể sẽ gắn bó với Rsync vào lúc này, nhưng tôi chắc chắn sẽ ra web và tìm hiểu các thành phần khác nhau của tập lệnh của bạn, vì nó có thể hữu ích trong tương lai.
artella

Đó dường như là chính xác giải pháp của tôi! Tôi muốn duy trì thời gian trong khi thêm một số dữ liệu meta vào thư viện nhạc của mình. Tuy nhiên, rõ ràng nó không thể xử lý khoảng trắng trong tên tệp):
Burcardo

2

Sử dụng thư mục nguồn (ví dụ /path/to/source) làm tham chiếu cho lệnh cảm ứng. Chỉ cần cdvào thư mục đích của bạn và làm

find -type f -exec touch -r /path/to/source/{} {} \;

Bạn không thể sao chép dấu thời gian phụ thứ hai bằng rsync (chưa).

Điều này cũng hoạt động cho các thư mục và tập tin giả (chỉ cần loại bỏ hoặc thay đổi -type f)


Điều này rất hữu ích cho tôi vì tôi cần phải sao chép. Tôi nhận thấy nó không sao chép ctime, nó ổn trong trường hợp của tôi.
snapfractalpop

Chỉ cần đọc trang của 'chạm'. Bạn có thể thiết lập atime và mtime cả với lệnh này.
knorke

Vâng, tôi biết bạn có thể sử dụng touch -arnhưng điều đó vẫn không thay đổi thời gian. Tôi cho rằng điều đó hiếm khi mong muốn.
snapfractalpop

Ah, tôi thấy vấn đề bây giờ. Cảm ơn. Vâng, ctime rất khó thay đổi và tôi không biết tại sao.
knorke

1

Chà, bạn chắc chắn có thể viết một kịch bản đọc dấu thời gian từ một phía và sau đó sử dụng cảm ứng để đặt nó trên cùng một tệp ở phía bên kia.

Nhưng điều đó có thể sẽ khiến bạn mất nhiều thời gian hơn chỉ đơn giản là để rsync cố gắng sao chép tất cả các tệp. Rất ít dữ liệu sẽ thực sự được chuyển (chỉ chặn băm nếu các tệp thực sự giống hệt nhau). Nhưng ít nhất nội dung của mỗi tệp sẽ phải được đọc ở mỗi bên ít nhất. Vì vậy, bạn bị giới hạn bởi băng thông đĩa hoặc IOPS, có thể mất một lúc. Nhưng có lẽ vẫn còn ít thời gian hơn so với việc viết và thử nghiệm một kịch bản để làm điều đó.


Cảm ơn, tôi không biết về tính năng này của rsync (nó cũng được thảo luận trong wikipedia).
artella

0

Đối với những người như tôi, những người có ý định sửa đổi các tệp và muốn giữ lại dấu thời gian ban đầu (ví dụ: bạn cập nhật các thẻ meta của thư viện nhạc của bạn).

Nó dựa trên giải pháp được cung cấp bởi Stone. Tuy nhiên, ở đây về thời gian sửa đổi và một kịch bản làm việc để khôi phục dấu thời gian. FIRST làm bước một, sau đó bắt đầu làm việc với các tệp của bạn.

  1. Bảo tồn dấu thời gian cũ . Nó hoạt động từ thư mục hiện tại, loại trừ tất cả các tệp ẩn và lưu nó vào tệp tạm thời /tmp/files. Bạn luôn có thể thay đổi các tham số, nhưng tốt hơn hết là -printf '"%t" "%p"\n'touchlệnh sau sử dụng điều đó.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Sửa đổi các tập tin của bạn nhiều như bạn muốn

  3. bây giờ tạo một tệp giúp bạn khôi phục dấu thời gian:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. Và cuối cùng áp dụng ngày cũ cho các tập tin sửa đổi

    sh job.sh

Hãy cẩn thận: hoạt động cho các tệp có khoảng cách tên, ký tự đặc biệt, nhưng ví dụ, không có tệp nào có $dấu trong đó.


Để tránh (một số) vấn đề với dấu gạch chéo ngược trong tên tệp của bạn, hãy sử dụng read -r line. Vâng, luôn luôn sử dụng readvới -r. Bên cạnh đó, bạn có thể tránh mở job.shcho mỗi tệp. Chỉ cần đặt chuyển hướng vào cuối lệnh:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

2 Caveat: Kịch bản này không chuyển dấu thời gian của các thư mục. (Chà, OP đã không yêu cầu điều đó.)
hagello

0

Cách tốt nhất để chỉ sao chép dấu thời gian trên Windows:

Để sao chép dấu thời gian được tạo / sửa đổi / truy cập lần cuối của bất kỳ tệp nào sang tệp khác, bạn có thể sử dụng:

chạm / c / m / a / r SourceFile DestFile

(Phiên bản Touch này là một phần của Hộp công cụ Bảng điều khiển Win32 http://www.stevemiller.net/apps/ )

Robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPUALL / DCOPY: DAT / XF . / R: 10 / W: 5 / V / ETA


-1

Hướng dẫn rsync: man rsyncliệt kê một -t-Nchuyển đổi, chúng có thể đáng để thay đổi.


Tôi không thể nhìn thấy -N. Tại sao bạn lại đề nghị những điều này?
Tom Hale
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.