rsync 文件来源和目录结构

rsync 文件来源和目录结构

我一直在通过使用 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/

我刚刚测试过,它似乎按照我理解的方式工作。

相关内容