rsync 选项--list-only
似乎给出的输出不太正确。这是我的测试文件:
~/src$ ls
lrwxrwxrwx 1 michael michael 23 Sep 5 09:19 far_symlink -> /home/michael/Documents
-rw------- 1 michael michael 0 Sep 5 09:18 file
lrwxrwxrwx 1 michael michael 4 Sep 5 09:18 near_symlink -> file
我想要一个将被传输的文件列表,并且我不需要符号链接,所以我使用以下命令运行它--list-only
:
~/src$ rsync -r --no-links --list-only ./ ~/dest
drwx------ 4,096 2018/09/05 09:19:05 .
lrwxrwxrwx 23 2018/09/05 09:19:05 far_symlink
-rw------- 0 2018/09/05 09:18:15 file
lrwxrwxrwx 4 2018/09/05 09:18:28 near_symlink
它表示符号链接将要可以转移,但事实并非如此。如果我真的进行转账:
~/src$ ls ~/dest
drwx------ 2 michael michael 4.0K 2018-09-05 09:39:16 .
drwxr-xr-x 30 michael michael 4.0K 2018-09-05 09:44:49 ..
~/src$ rsync -r --no-links ./ ~/dest
skipping non-regular file "far_symlink"
skipping non-regular file "near_symlink"
~/src$ ls ~/dest
drwxr-xr-x 30 michael michael 4.0K 2018-09-05 09:44:49 ..
-rw------- 1 michael michael 0 2018-09-05 09:48:10 file
drwx------ 2 michael michael 4.0K 2018-09-05 09:48:10 .
符号链接未发送。
所以给人的感觉--list-only
就是不诚实。有没有什么方法可以获取实际要传输的文件的列表(无需与远程 ssh 服务器等进行联系)?我缺少什么?
我使用的是 Ubuntu 18.04。其他详情:
$ uname -a
Linux ubuntu 4.15.0-33-generic #36-Ubuntu SMP Wed Aug 15 16:00:05 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ rsync --version
rsync version 3.1.2 protocol version 31
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes, prealloc
更新:请原谅我糟糕的术语。我理解什么是 a 之间的区别候选人转移与什么将要被转移。我的问题是为什么符号链接被视为候选人转移(并因此被 列出--list-only
),而无论目的地的条件如何,它们显然都不会被转移,并且(我认为)它们被 明确排除no-links
。
答案1
该--list-only
选项不识别文件将要被转移;它只识别那些文件候选人以便被转移。你可以在这里看到这个
touch aa bb cc; ln -s cc dd
rsync --list-only --no-links -a ?? /tmp
rsync -av ?? /tmp
rsync --list-only --no-links -a ?? /tmp
最后的输出rsync
-rw-r--r-- 0 2018/09/05 16:35:01 aa
-rw-r--r-- 0 2018/09/05 16:35:01 bb
-rw-r--r-- 0 2018/09/05 16:35:01 cc
lrwxrwxrwx 2 2018/09/05 16:35:01 dd -> cc
考虑最后一个rsync
,其中文件已经传输并且在源上保持不变。如果--list-only
要显示需要传输的文件,则不会列出任何内容。但是,它仍然显示需要考虑的源文件集。
如果您想使用目标的上下文来管理要报告的文件集,请使用--dry-run --info=name
rsync --dry-run --info=name --archive --no-links ?? /tmp
或者,如果您想要与生成的输出类似的输出--list-only
(特别是省略第一个字符中的条目类型)
rsync --dry-run --info=name --out-format='%B%16l %t %f' --archive --no-links ?? /tmp
初始输出
skipping non-regular file "dd"
rw-r--r-- 0 2018/09/05 16:42:30 aa
rw-r--r-- 0 2018/09/05 16:42:30 bb
rw-r--r-- 0 2018/09/05 16:42:30 cc
复制文件后的后续输出
skipping non-regular file "dd"