如何打印将使用rsync更改的文件?


32

有没有办法让rsync将完整的文件路径打印到所有不同的文件而无需实际传输任何文件?

另外,我需要一种仅基于大小或上次修改时间将文件跨两棵树(通过SSH)进行比较的方法。

Answers:


33

Rsync有一个dry-run选项:

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

我不确定这是否是您想要的。

如果要diff在两棵树上浏览文件,则可以使用find和pipe递归搜索两个方向,以输出到ls并将它们都通过管道传输到文件。然后,您可以diff用来比较文件。


3
+1,它内置于rsync中。输出的详细信息--dry-run将取决于您对-vand 的使用,--progress options因此,如果根本没有输出,请检查是否根据需要设置了这些选项。我注意到,即使文件没有更改,它也将发送目录名称,但是您可以通过将输出通过sed或类似方式将其过滤掉。
David Spillett

4
但是--dry-run似乎显示文件,即使它们相同。
Quantum7 '18 -10-23

14

我更喜欢使用--out-format来查看详细信息,将其简化为以下内容:

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

7

rsync -rvn localdir targetdir

-n表示仅显示动作(不执行任何动作)。

请注意,您需要输入“ v”,否则将不会显示任何内容!(其余答案忘记了这一点...)


2
对于追随者-n等效于“ --dry-run” :)
rogerdpack

1

基于其他答案和https://serverfault.com/a/618740/114520

  • 使用--dry-run(或-n)避免修改
  • 使用--itemize-changes(或-i)查找更改
  • 使用--archive(或-a)获取所有子目录
  • 用于egrep过滤以点开头的条目(不变)

这给你: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

如果只想一种方法,可以更改命令:

  • 对于从源到目标的更改: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • 对于从目标到源的更改: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

如果只需要文件,则添加awk魔术:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'


0

我会去这样的事情:

#! /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"

例如:

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

0

事情的真相是,如果你运行rsync -v ...它的文件名输出到屏幕上,该文件正在被转移(或者将已经转移,如果你正在做一个--dry运行)。要确定为什么 rsync将要传输它,请使用逐项模式:https : //serverfault.com/a/618740/27813

正如其他人指出的那样,默认情况下,rsync仅根据文件大小和时间戳进行比较,这两者都必须匹配,否则将在该文件上启动“增量复制”。如果您真的想查看哪些文件不同,请使用“ -c”校验和模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.