【问题标题】:How can I configure rsync to create target directory on remote server?如何配置它以在服务器上创建目标目录?
【发布时间】:2010-12-10 20:22:22
【问题描述】:

我想rsync 从本地计算机到服务器。在一个不存在的目录上,我希望rsync 先在服务器上创建该目录。

我该怎么做?

【问题讨论】:

    标签: rsync


    【解决方案1】:

    如果您使用的版本或 rsync 没有“mkpath”,那么 --files-from 可以提供帮助。假设你需要在目标目录中创建'mysubdir'

    创建“filelist.txt”以包含 我的子目录/虚拟

    mkdir -p source_dir/mysubdir/
    touch source_dir/mysubdir/dummy
    rsync --files-from='filelist.txt' source_dir target_dir
    

    rsync 会将 mysubdir/dummy 复制到 target_dir,在此过程中创建 mysubdir。在 Raspberry Pi OS (debian) 上使用 rsync 3.1.3 进行测试。

    【讨论】:

      【解决方案2】:

      这会在目标中创建目录树/usr/local/bin,然后递归同步所有包含的文件和文件夹:

      rsync --archive --include="/usr" --include="/usr/local" --include="/usr/local/bin" --include="/usr/local/bin/**" --exclude="*" user@remote:/ /home/user
      

      mkdir -p 相比,目录树甚至具有与源相同的权限。

      【讨论】:

        【解决方案3】:

        使用 rsync 两次~

        1:传输一个临时文件,确保已创建远程相对目录。

        tempfile=/Users/temp/Dir0/Dir1/Dir2/temp.txt
        # Dir0/Dir1/Dir2/ is directory that wanted.
        rsync -aq /Users/temp/ rsync://remote
        

        2:那么你可以指定传输文件/目录的远程目录

        tempfile|dir=/Users/XX/data|/Users/XX/data/
        rsync -avc /Users/XX/data rsync://remote/Dir0/Dir1/Dir2
        # Tips: [SRC] with/without '/' is different
        

        【讨论】:

          【解决方案4】:
          rsync source.pdf user1@192.168.56.100:~/not-created/target.pdf
          

          如果完全指定了目标文件,则不会创建目录~/not-created

          rsync source.pdf user1@192.168.56.100:~/will-be-created/
          

          但是目标只指定了一个目录,目录~/will-be-created被创建。必须跟/ 让rsync 知道will-be-created 是一个目录。

          【讨论】:

            【解决方案5】:

            来自rsync 手册页 (man rsync):

            --mkpath                 create the destination's path component
            

            【讨论】:

            • 这是唯一对我有用的选项。
            • 请注意,此选项仅在版本 3.2.3(2020 年 8 月 6 日)中添加。
            【解决方案6】:

            如果您要创建的叶目录不止一个,您可以先运行一个单独的ssh ... mkdir -p,或者使用--rsync-path 技巧作为explained here

            rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
            

            或者按照 Tony 的建议使用 --relative 选项。在这种情况下,您只需指定必须存在的目标的根目录,而不是将创建的源的目录结构:

            rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/
            

            这样,你最终会得到 /pre_existing/dir/new/x/y/z/

            如果你想创建“y/z/”,但不在“new/x/”内部,你可以在你想要--relative开始的地方添加./

            rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
            

            将创建 /pre_existing/dir/y/z/。

            【讨论】:

            • 我正在访问的服务器没有mkdir,所以我使用了破解:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \ 它确实创建了一个额外的文件,但您可以稍后删除。
            • 这似乎不适用于较新的 rsync 协议,使用 && 或 ; 时出现类似于以下的错误在 --rsync-path scp 命令中的无效字符!这里:&& /usr/bin/rsync
            • @ghitesh 你有没有试图逃避&&
            • @FelipeAlvarez 是的,我做到了,但没有工作。我现在找不到链接,但一些文档说这是固定的,因为我相信它可以(并且曾经)被利用。
            • 谢谢,这行得通。在我的情况下,我在远程服务器上运行本地 bash 脚本,并在其中运行正在执行的 ssh mkdir 命令,然后在运行 rsync 命令之前杀死脚本的其余部分。这允许脚本的其余部分正常运行。
            【解决方案7】:

            这个答案使用了一些其他答案,但希望它会更清楚地了解情况。您从未指定要 rsync 的内容 - 单个目录条目或多个文件。

            因此,假设您正在移动一个源目录条目,而不仅仅是移动其中包含的文件。

            假设您在本地有一个名为data/myappdata/ 的目录,并且在它下面有很多子目录。 你的目标机器上有data/,但没有data/myappdata/——这很容易:

            rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
            

            您甚至可以为远程目录使用不同的名称:

            rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname
            

            如果您只是移动一些文件而不移动包含它们的目录条目,那么您会这样做:

            rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/
            

            它会在远程机器上为您创建myappdata 目录来放置您的文件。同样,data/ 目录必须存在于远程机器上。

            顺便说一句,我使用-rvv 标志是为了获得双重详细的输出,以便清楚它的作用以及必要的递归行为。

            只是为了向您展示我在使用 rsync(Ubuntu 12.04 上的 3.0.9)时得到的结果

            $ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
            opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
            user@remote.machine's password:
            sending incremental file list
            created directory /tmp/newdir
            delta-transmission enabled
            bar.txt
            foo.txt
            total: matches=0  hash_hits=0  false_alarms=0 data=0
            

            希望这能稍微澄清一下。

            【讨论】:

            • 这并没有完全按预期工作。我尝试了第一个命令rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata,但它在目标上创建的是/remote/path/to/data/myappdata/myappdata/
            • 如果我对您的第一个命令稍作更改并在源路径后添加一个斜杠“/”,那么它可以工作......就像这样:rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
            【解决方案8】:

            例如:

            来自:/xxx/a/b/c/d/e/1.html

            到:user@remote:/pre_existing/dir/b/c/d/e/1.html

            rsync:

            cd /xxx/a/ && rsync -auvR b/c/d/e/ user@remote:/pre_existing/dir/

            【讨论】:

              【解决方案9】:

              -R, --relative 选项将执行此操作。

              例如:如果您想备份/var/named/chroot 并在远程服务器上创建相同的目录结构,那么-R 会这样做。

              【讨论】:

              • 您也可以在源路径中使用/./,仅指定要创建的部分路径。有关详细信息,请参见手册页。
              • 为什么要投票?答案是错误的,如果目标文件夹不存在,rsync 不会自动创建目录。叹息。
              • 我强烈建议读者查看--relative 的联机帮助页。它可能不会像你想的那样。
              • --relative 将完整路径而不是文件粘贴在您在服务器上提供的端点上。通常 /tmp/foo/bar/file.c 到 remote:/tmp 会产生 remote:/tmp/file.c 但使用 -R 它会创建 /tmp/foo/bar/file.c 不要使用这个选项,除非你知道你在做什么,你会得到一个非常混乱的目录结构。
              • @Marki555 的评论是成功的关键。 --relative/./ 是大多数新手会寻找的。 rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/ 会将桌面的内容复制到目标桌面。不知道用户名的差异会如何影响这一点。
              【解决方案10】:

              假设你使用ssh连接rsync,那么之前发送ssh命令怎么样:

              ssh user@server mkdir -p existingdir/newdir
              

              如果它已经存在,则什么都不会发生

              【讨论】:

              • ufk 请求的语法将导致“rsync 在服务器上创建 [a missing target] 目录 [&& 复制文件]。”您的回复是有效的,因为它将在服务器上创建缺少的目标目录......但不是rsync,因此没有答案。
              • 如果ssh 不受支持并且rsync 连接到远程端的rsync daemon,则此选项无效。
              【解决方案11】:

              这对我有用:

               rsync /dev/null node:existing-dir/new-dir/
              

              我确实收到了这条消息:

              skipping non-regular file "null"
              

              但我不必担心会有一个空目录。

              【讨论】:

              • 感谢kdubs的回答。那效果很好。因此,如果我想将我正在同步的文件保留在我指向的文件夹中作为源,那么我只需要指定它,它就会被创建。例如:rsync -avph /mytest/ /otherfolder/mytest/ 然后我得到输出“created directory /otherfolder/mytest”
              • 不要忘记new-dir末尾的斜杠('/'),否则会创建一个非目录文件。
              • 它只适用于单级新目录,如果你想要 /new-dir1/new-dir2/ 它将不起作用
              • true,在这种情况下运行两次,或三次... 8-)
              【解决方案12】:

              我认为你不能用一个 rsync 命令来做到这一点,但你可以先“预先创建”额外的目录,如下所示:

              rsync --recursive emptydir/ destination/newdir
              

              其中 'emptydir' 是本地空目录(您可能必须先将其创建为临时目录)。

              这有点小技巧,但对我有用。

              干杯

              克里斯

              【讨论】:

              • 不需要使用临时文件夹。请参阅上面的rsync /dev/null node:existing-dir/new-dir/ 建议。
              猜你喜欢
              • 1970-01-01
              • 2013-01-14
              • 2012-11-07
              • 2021-02-16
              • 2012-10-04
              • 2010-10-26
              • 1970-01-01
              • 2015-08-18
              • 1970-01-01
              相关资源
              最近更新 更多