我想 rsync从本地计算机到服务器。在一个不存在的目录上,我希望 rsync首先在服务器上创建该目录。
rsync
我该怎么做?
我不认为只用一个 rsync 命令就可以做到这一点,但是您可以像下面这样首先“预先创建”额外的目录:
rsync --recursive emptydir/ destination/newdir
其中“ em ptydir”是一个本地空目录(您可能必须首先将其创建为一个临时目录)。
虽然有点蹩脚,但对我很管用。
干杯
克里斯
这招对我很管用:
rsync /dev/null node:existing-dir/new-dir/
我明白了:
skipping non-regular file "null"
但是我不必担心有一个空的目录挂在周围。
假设您使用 ssh 连接 rsync,那么在以下命令之前发送 ssh 命令会怎样:
ssh user@server mkdir -p existingdir/newdir
如果它已经存在,什么都不会发生
-R, --relative选项将执行此操作。
-R, --relative
例如: 如果您想备份 /var/named/chroot并在远程服务器上创建相同的目录结构,那么 -R就会这样做。
/var/named/chroot
-R
这个答案使用了一些其他的答案,但是希望它能够更加清楚地说明当时的情况。您从未指定要同步的内容——单个目录条目还是多个文件。
因此,让我们假设您正在移动一个源目录条目,而不仅仅是移动其中包含的文件。
假设您有一个本地名为 data/myappdata/的目录,并且在此目录下有大量子目录。 你的目标机器上有 data/,但是没有 data/myappdata/——这很简单:
data/myappdata/
data/
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/目录。
myappdata
顺便说一下,我使用 -rvv标志是为了获得双倍详细的输出,这样就可以清楚地了解它的作用,以及必要的递归行为。
-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
希望这能让你明白一点。
如果要创建的叶子目录多于最后一个,那么可以首先运行单独的 ssh ... mkdir -p,或者使用 --rsync-path技巧作为 在这里解释:
ssh ... mkdir -p
--rsync-path
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
或者像托尼建议的那样使用 --relative选项。在这种情况下,只需指定必须存在的目标的根目录,而不需要指定将创建的源目录结构:
--relative
rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/
这样,您最终将得到/pre _ 嘴/dir/new/x/y/z/
如果你想创建“ y/z/”,而不是在“ new/x/”中,你可以在 --relative开始的地方添加 ./:
./
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
将创建/pre _ living/dir/y/z/。
例如:
来自:/xxx/a/b/c/d/e/1. html
发送到: user@remote:/pre _ living/dir/b/c/d/e/1. html
返回文章页面
Cd/xxx/a/& & rsync-auvR b/c/d/e/user@remote:/pre _ living/dir/
--mkpath是在 rsync 3.2.3(2020年8月6日)中添加的:
--mkpath
--mkpath create the destination's path component
rsync source.pdf user1@192.168.56.100:~/not-created/target.pdf
如果完全指定了目标文件,则不创建目录 ~/not-created。
~/not-created
rsync source.pdf user1@192.168.56.100:~/will-be-created/
但是只用一个目录指定了目标,就创建了目录 ~/will-be-created。必须遵循 /才能让 rsync 知道 will-be-created是一个目录。
~/will-be-created
/
will-be-created
使用 rsync 两次 ~
1: 传输一个临时文件,确保创建了远程相对目录。
tempfile=/Users/temp/Dir0/Dir1/Dir2/temp.txt # Dir0/Dir1/Dir2/ is directory that wanted. rsync -aq /Users/temp/ rsync://remote
然后您可以为传输文件/目录指定远程目录
tempfile|dir=/Users/XX/data|/Users/XX/data/ rsync -avc /Users/XX/data rsync://remote/Dir0/Dir1/Dir2 # Tips: [SRC] with/without '/' is different
这将在目标中创建目录树 /usr/local/bin,然后递归地同步所有包含的文件和文件夹:
/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相比,目录树甚至具有与源代码相同的 perms。
mkdir -p
如果您使用的版本或 rsync 没有“ mkpath”,那么—— files-from 可以提供帮助。假设您需要在目标目录中创建‘ mysubdir’
创建要包含的‘ filelist.txt’ Mysubdir/傀儡
mkdir -p source_dir/mysubdir/ touch source_dir/mysubdir/dummy rsync --files-from='filelist.txt' source_dir target_dir
Rsync 将把 mysubdir/dul 复制到 target _ dir,并在过程中创建 mysubdir。