斜杠和rsync命令

77

我正试图做与此问题类似的事情:如何进行双向同步?

然而,我无法确定是否应该在文件路径末尾添加斜杠。基本上,我正在尝试创建一个别名命令,同步两个名称相同但位于不同服务器上的目录内容。我不希望一个目录被复制到另一个目录中(我知道这是可能发生的,取决于如何处理末尾的斜杠)。

我目前拥有的是:

alias syncDirectories1 = 'rsync -tvur name@host:/Users/me/directory/ /Users/me/directory/'
alias syncDirectories2 = 'rsync -tvur /Users/me/directory/ name@host:/Users/me/directory/'

为了我想要实现的目标,这两个文件路径的末尾应该有斜杠吗?

5个回答

105
这在rsync(1)的手册中有描述:

源路径末尾的斜杠会改变行为方式,避免在目标路径上创建一个额外的目录层级。你可以把源路径上的末尾斜杠看作是“复制这个目录的内容”,而不是“按名称复制此目录”,但在两种情况下,包含目录的属性都会被传递到目标路径的相应目录中。换句话说,下面的每个命令都以相同的方式复制文件,包括它们设置的/dest/foo目录属性:

rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
关于目标位置,我认为它并没有什么重大后果。如果源是一个文件而目标位置不存在,那么将复制SRC到名为DEST的文件中。
rsync SRC DEST

而这将创建目录DEST并将SRC文件复制到其中:

rsync SRC DEST/

31

我在 Arch Linux 上使用 rsync 3.1.3 进行了测试,结果如下:

1. rsync -avPzu test  login@remote:/home/login/test   "test" directory is copied inside of existing "test" on remote (structure is then test/test/...)
2. rsync -avPzu test  login@remote:/home/login/test/  same as above
3. rsync -avPzu test/ login@remote:/home/login/test   content of "test" directory is synchronized with the remote "test" directory
4. rsync -avPzu test/ login@remote:/home/login/test/  same as above
5. rsync -avPzu test  login@remote:/home/login/       same as above
6. rsync -avPzu test  login@remote:/home/login        same as above

在这种情况下,方法3-6才是正确的,与被接受的答案相反。


4
还有其他情况:目标文件夹是否已经存在。我认为我遇到过这样的情况:第一次同步时,它会同步并创建文件夹,但下一次同步会创建一个同名的子文件夹。 - Sarke

6
保留源地址中的斜杠,而在目标地址中删除它们。 像这样:
alias syncDirectories1 = 'rsync -tvur name@host:/Users/me/directory/ /Users/me/directory'
alias syncDirectories2 = 'rsync -tvur /Users/me/directory/ name@host:/Users/me/directory'

6

我在Ubuntu 17.04上执行了与被接受答案不同的操作,目标“/”似乎没有效果。我执行了以下四个命令:

rsync -av src  nslash    # No slashes on either src or dest
rsync -av src  dslash/   # Slash on Dest only  
rsync -av src/ sslash    # Slash on src only 
rsync -av src/ sdslash/  # Slash on both src and dest

结论:

  • src路径中有 / ,则只复制 src 下的文件到 dest 下,不管 dest 末尾是否有 / 。
  • src 路径中没有 / ,则将 src 及其所有内容复制到 dest 下。
  • dest 路径中的斜线没有影响。

0
实验设置:
rm -r *; mkdir -p src/src_content dst/dst_content; tree

.
├── dst
│   └── dst_content
└── src
    └── src_content

命令变体 find dst -name *content 注释
rsync -a src dst dst/src/src_content
dst/dst_content
srcdir移动
rsync -a src/ dst dst/src_content
dst/dst_content
srcdir合并

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接