我有一个包含目录列表及其绝对路径的文本文件
$ 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)
这里出了什么问题?
我想使用 rsync 复制所有这些目录 [from a list] 保留其绝对路径到另一个位置
不要使用--include
或--filter
变体,因为这只会混淆事物。相反,使用--files-from=_filename_
. (如果这样做,请确保进行大量测试。)
在文件中创建目录列表,每行一个目录/文件。
将 rsync--files-from=
与上述文件一起使用。
使用--relative
/-R
选项确保在目标的末尾复制源路径名。
即使您有-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 只会打印出可能已复制的内容。)
使用以下命令:
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/Dir1
and /media/MyDestination/Dir2
,--relative
整个源路径被复制到目标)。