为什么 rsync 添加额外的目录?

为什么 rsync 添加额外的目录?

我之前在跑步

rsync -rv /home/myname/mydir1 myhost:/home/myname/mydir1

并得到了

/home/mydir1/mydir1/...

我该如何解决这个问题,这样我就没有多余的“mydir1”?

答案1

请参阅“用法”部分中的示例rsync 手册页

您可以使用

rsync -rv /home/myname/mydir1 myhost:/home/myname

或者

rsync -rv /home/myname/mydir1/ myhost:/home/myname/mydir1

答案2

rsync -rv /home/myname/mydir1/* myhost:/home/myname/mydir1

仅复制 mydir1 下的文件(和子目录)

rsync -rv /home/myname/mydir1 myhost:/home/myname/mydir1

将复制目录本身,这样你就得到 mydir1/mydir1

    francois@zaphod:~/tmp$ rm -rf b
    francois@zaphod:~/tmp$ mkdir b
    francois@zaphod:~/tmp$ rsync -rv a/* b
    sending incremental file list
    a

    sent 80 bytes  received 35 bytes  230.00 bytes/sec
    total size is 0  speedup is 0.00
    francois@zaphod:~/tmp$ tree b
    b
    └── a

    0 directories, 1 file


 francois@zaphod:~/tmp$ rm -rf b
    francois@zaphod:~/tmp$ rsync -rv a b
    sending incremental file list
    created directory b
    a/
    a/a

    sent 108 bytes  received 63 bytes  342.00 bytes/sec
    total size is 0  speedup is 0.00
    francois@zaphod:~/tmp$ tree b
    b
    └── a
        └── a

    1 directory, 1 file

答案3

这是一个罕见的情况,尾随/很重要。在许多命令中指定foofoo/是相同的。但它确实有语义上的差异。在某些命令(包括 rsync)中,尾随/告诉命令根据这是一个目录的事实采取特殊操作。如果您遇到由...造成的情况

mkdir foo bar
touch foo/baz

...并且您想将内容从 foo 复制到 bar 然后不要指定...

rsync -rv foo bar

...而是指定...

rsync -rv foo/ bar

否则 rsync 会认为您希望将整个树(包括父目录)复制到您找到的目标目录中。


另一个类似的例子有效的语义是ls列出链接时:

mkdir foo
touch foo/baz
ln -s foo bar

ls -l bar
lrwxrwxrwx 1 philip philip 3 May  7 14:58 bar -> foo

ls -l bar/
total 0
-rw-r----- 1 philip philip 0 May  7 14:58 baz

相关内容