我一直在通过使用 shell 中的字符串列表手动构建 rsync 命令来复制一些文件和文件夹。
对于远程文件结构,例如:
/home/foo/
media/
bigfile.bin
somedir/
a.txt
b.json
我会写:
rsync -Pavz my_remote:/home/foo/{media/bigfile.bin,somedir} .
生成的本地文件结构是
./bigfile.bin
./somedir/
a.txt
b.json
目录结构很重要。 bigfile.bin
不在本地media/
目录中,而是somedir
递归复制的。这就是我想要的。
现在,我有一个脚本来构建要传输的文件列表,以便我可以使用
rsync -Pavz --files-from=list.txt my_remote:/home/foo
哪里list.txt
media/bigfile.bin
somedir/
现在,生成的本地文件结构是
./media/
bigfile.bin
./somedir/
a.txt
b.json
我现在有了media
我不想要的目录,我想是因为公共基目录为my_remote:/home/foo
.使用时有什么方法可以恢复以前的行为吗--files-from
?如果我打开--no-R
,一切都会变平,但实际上我仍然想要somedir/
。更一般地说,所需的行为是“获取指定路径的基本部分 ( bigfile.bin
, somedir
) 并递归复制它及其内容,忽略media
目标路径中的父目录 ( )”。
我还可以使用一个脚本来构建带有花括号的 rsync 命令,以便像我最初所做的那样由 shell 扩展,但我可能必须处理远程文件名中令人头疼的字符转义问题,我宁愿使用--files-from
.
答案1
我认为您正在寻找的是以下内容(rsync
版本=> 2.6.7)。
在您不想包含的路径末尾list.txt
添加一个点斜杠:./
media/./bigfile.bin
somedir/
在这种情况下./
会忽略线路的rsync
路径。media/
media/./bigfile.bin
从手册页
--relative, -R
...
It is also possible to limit the amount of path information that is
sent as implied directories for each path you specify. With a modern
rsync on the sending side (beginning with 2.6.7), you can insert a dot
and a slash into the source path, like this:
rsync -avR /foo/./bar/baz.c remote:/tmp/
我刚刚测试过,它似乎按照我理解的方式工作。