我一直在通过使用 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
我不想要的目录,我猜是因为comman 基本目录为my_remote:/home/foo
. 使用时有什么方法可以恢复以前的行为吗--files-from
?如果我打开--no-R
,一切都会变平,但实际上我仍然想要somedir/
。更一般地说,所需的行为是“获取指定路径的基本部分 ( bigfile.bin
, somedir
) 并递归复制它及其内容,忽略media
目标路径中的父目录 ( )”。
我还可以使用一个脚本来构建带有花括号的 rsync 命令,以便像我最初所做的那样由 shell 扩展,但我可能必须处理远程文件名中令人头疼的字符转义问题,我宁愿使用--files-from
.
我认为您正在寻找的是以下内容(
rsync
版本=> 2.6.7)。在您不想包含的路径末尾
list.txt
添加一个点斜杠:./
在这种情况下
./
会忽略线路的rsync
路径。media/
media/./bigfile.bin
从手册页
我刚刚测试过,它似乎按照我理解的方式工作。