rsync 文本文件中具有绝对路径的目录列表

ind*_*joe 9 rsync file-copy

我有一个包含目录列表及其绝对路径的文本文件

$ cat DirectoriesToCopy.txt

/data/Dir1
/data/Dir2
Run Code Online (Sandbox Code Playgroud)

我想使用 rsync 将所有这些目录复制到另一个位置,并保留其绝对路径。

我尝试了以下 rsync 命令,但它不起作用

rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*'  /  /media/MyDestination/
Run Code Online (Sandbox Code Playgroud)

这里出了什么问题?

Oth*_*eus 8

我想使用 rsync 复制所有这些目录 [from a list] 保留其绝对路径到另一个位置

不要使用--include--filter变体,因为这只会混淆事物。相反,使用--files-from=_filename_. (如果这样做,请确保进行大量测试。)

  1. 在文件中创建目录列表,每行一个目录/文件。

  2. 将 rsync--files-from=与上述文件一起使用。

  3. 使用--relative/-R选项确保在目标的末尾复制源路径名。

  4. 即使您有-a选择,也包括-r. 从手册页:

    在这两种情况下,如果启用了 -r 选项,则该目录的整个层次结构也将被传输(请记住,-r 需要使用 --files-from 显式指定,因为它不是由 -a 暗示的)。

完成命令:

rsync ${DEBUG:+-nv} -arR --files-from=<list_of_files.txt> <top-level-dir>  <target-dir>
Run Code Online (Sandbox Code Playgroud)

list_of_files.txt 中的文件必须是相对的或在top-level-dir 中找到

(如果设置了 DEBUG,rsync 只会打印出可能已复制的内容。)


wur*_*tel 6

使用以下命令:

rsync -av --include-from=DirectoriesToCopy.txt --include /data/ --exclude='/data/*' --exclude='/*/' / /media/MyDestination/
Run Code Online (Sandbox Code Playgroud)

您需要明确包含 /data/ ,您也可以将其添加到文件中的列表中。然后排除所有其他目录(顺序对于包含/排除很重要)。

请注意,您使用的-r是多余的,因为它包含在-a.

编辑:您也可以通过以下方式实现相同的结果:

rsync -av --relative /data/Dir1 /data/Dir2 /media/MyDestination/
Run Code Online (Sandbox Code Playgroud)

不是 rsync 迫使你做一些困难的事情,只是为了复制几个目录,它只是为你提供了多种方式来做同样的事情;在某些情况下,采用包含/排除方式可能更适合,在这里我会做上面的 --relative 事情(如果没有--relative你最终会得到/media/MyDestination/Dir1and /media/MyDestination/Dir2--relative整个源路径被复制到目标)。