Làm cách nào để in các tệp đã được thay đổi bằng rsync?


32

Có cách nào để có được rsync để in các tệp đầy đủ cho tất cả các tệp khác nhau mà không thực sự chuyển bất kỳ tệp nào không?

Ngoài ra, tôi cần một cách để phân biệt các tệp trên hai cây (qua SSH) chỉ dựa trên thay đổi kích thước hoặc thời gian sửa đổi lần cuối.

Câu trả lời:


33

Rsync có một dry-runtùy chọn:

-n, --dry-run               show what would have been transferred

Tôi không chắc chắn nếu đây là những gì bạn muốn.

Nếu bạn muốn diffcác tệp trên hai cây, bạn có thể tìm kiếm đệ quy hai hướng bằng find và pipe để xuất ra ls và dẫn cả hai vào một tệp. Sau đó bạn có thể sử dụng diffđể so sánh các tập tin.


3
+1, điều này được tích hợp vào rsync. Chi tiết về đầu ra của --dry-runsẽ phụ thuộc vào việc bạn sử dụng -v--progress options- vì vậy nếu bạn không nhận được đầu ra nào, hãy kiểm tra các tùy chọn này được đặt khi cần thiết. Tôi đã nhận thấy rằng nó sẽ gửi tên thư mục ngay cả khi các tệp không thay đổi, nhưng bạn có thể lọc chúng bằng cách chuyển đầu ra qua sedhoặc tương tự.
David Spillett

4
Nhưng --dry-run dường như hiển thị các tệp ngay cả khi chúng giống hệt nhau.
Quantum7

14

Tôi thích sử dụng định dạng --out để xem chi tiết, chuyển nó thành ít hơn:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less

7

rsync -rvn localdir targetdir

-N có nghĩa là chỉ hiển thị các hành động (không có bất kỳ hành động nào được thực hiện).

Lưu ý rằng bạn cần 'v' hoặc nó sẽ không hiển thị cho bạn bất cứ điều gì! (phần còn lại của câu trả lời quên điều này ...)


2
Đối với người theo dõi -n tương đương với "--dry-run" :)
rogerdpack

1

Dựa trên các câu trả lời khác và https://serverfault.com/a/618740/114520

  • sử dụng --dry-run(hoặc -n) để tránh sửa đổi
  • sử dụng --itemize-changes(hoặc -i) để tìm thay đổi
  • sử dụng --archive(hoặc -a) để có được tất cả các thư mục con
  • sử dụng egrepđể lọc ra các mục bắt đầu bằng dấu chấm (không thay đổi)

Cung cấp cho bạn: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Nếu bạn chỉ muốn một cách, bạn có thể thay đổi lệnh:

  • để thay đổi từ nguồn đến đích: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • để thay đổi từ đích đến nguồn: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

Và nếu bạn chỉ cần các tập tin, chỉ cần thêm awkphép thuật:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'


0

Tôi sẽ đi cho một cái gì đó như thế này:

#! /bin/bash 

set -eu   ## Stop on errors and on undefined variables

## The local directory name
LOCAL_DIR=$1
## The remote directory in rsync sintax. Example: "machine:directory"
REMOTE_DIR=$2

shift 
shift 
# Now the first two args are gone and any other remaining arguments, if any, 
# can be expanded with $* or $@

# Create temporary file in THIS directory (hopefully in the same disk as $1:
# we need to hard link, which can only made in the same partition)
tmpd="$(mktemp -d  "$PWD/XXXXXXX.tmp" )"

# Upon exit, remove temporary directory, both on error and on success
trap 'rm -rf "$tmpd"' EXIT

# Make a *hard-linked* copy of our repository. It uses very little space 
# and is very quick 
cp -al "$LOCAL_DIR" "$tmpd"

# Copy the files. The final «"$@"» allows us to pass on arguments for rsync 
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/   "$tmpd/"  --size-only "$@"

# Compare both trees
meld "$LOCAL_DIR"  "$tmpd"

Ví dụ:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build

0

Sự thật của vấn đề là nếu bạn chạy rsync -v ...và nó xuất tên tệp ra màn hình, tệp đó sẽ được chuyển (hoặc sẽ được chuyển, nếu bạn đang thực hiện --dry-run). Để xác định lý do tại sao rsync sắp chuyển nó, hãy sử dụng chế độ ghi mục: https://serverfault.com/a/618740/27813

Như những người khác đã lưu ý, theo mặc định, rsync chỉ so sánh dựa trên kích thước tệp và dấu thời gian, cả hai phải khớp với "bản sao delta" khác được bắt đầu trên tệp đó. Nếu bạn thực sự muốn xem tập tin nào khác nhau, hãy sử dụng chế độ kiểm tra "-c".

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.