使用-r
or--recursive
会导致rsync
递归到目录。-a
或--archive
等于-rlptgoD
,所以-a
暗示-r
。
如果我有目录source/
并且dest/
我运行:
rsync source dest
然后rsync
跳过source/
并且不复制任何内容。如果我运行:
rsync -a source dest
然后-a
暗示-r
并将其所有内容rsync
复制到。source/
dest/
但是,如果我有一个list.txt
包含该行的文件source
,并且我的目录的完整路径source/
是/home/user/source/
,并且我运行:
rsync -a --files-from=list.txt /home/user/ dest
那么rsync
只复制source/
到dest/
但不复制其内容。如果我运行不带选项的命令,也会发生同样的情况-a
。
但是如果我运行相同的命令-r
:
rsync -r --files-from=list.txt /home/user/ dest
然后将其所有内容rsync
复制到.source/
dest/
我的问题是:
- 为什么不
-a
暗示-r
何时--files-from=FILE
使用该选项?这是预期的行为吗? - 鉴于该命令
rsync source dest
跳过source/
并复制任何内容,因为source/
是一个目录,并且既没有使用-a
也没有-r
使用,为什么该命令rsync --files-from=list.txt /home/user/ dest
仍然复制source/
到dest/
? - 使用
-a
该选项时,隐含的其他选项是否仍然有效?--files-from=FILE
是-r
唯一被遗漏的选项吗?
编辑:看来我应该man
更仔细地阅读该页面。在该选项的描述下,--files-from=FILE
它说:
--archive (-a) 选项的行为并不意味着 --recursive (-r),因此如果需要,请显式指定它。
(回答我的第一个问题。)
隐含了 --dirs (-d) 选项,它将创建目标列表中指定的目录,而不是大声地跳过它们(如果要关闭它,请使用 --no-dirs 或 --no-d )。
(回答我的第二个问题。)
答案1
-a
,--archive
这相当于
-rlptgoD
.这是表达您想要递归并想要保留几乎所有内容的快速方式(使用-H
一个值得注意的遗漏)。 上述等价的唯一例外是何时--files-from
指定,在这种情况下-r
不隐含。
当您使用 时--files-from
,递归被禁用(这是唯一遗漏的选项)。假设用户确切地知道要传输哪些特定文件,并且他们已在与 一起使用的文件列表中指定了这些文件--files-from
。
如果在文件列表中指定了目录,则将同步其所有权、时间戳等,但不会同步其内容。
不过,您可以-r
显式添加该标志:
rsync -av --files-from=file.list -r src/ dst/
这将产生您正在寻找的效果。