我有以下文本文件
...
/a/b/c/f1
/a/b/c/f2
...
/a/b/c/d1
...
其中f1
和f2
是文件,而d1
是目录。我想在我的目标文件夹 ( /z
) 中复制确切的层次结构。
使用 bash,对于lr
从文本文件中读取的每一行,我的脚本都会运行(为了简单起见,我省略了选项)
rsync $lr/ /z/$lr
该文件夹已正确复制,因为我获得了/z/a/b/c/d1
. 不幸的是,对于文件结果
/z/a/b/c/f1/f1
/z/a/b/c/f2/f2
我如何使用上述相同rsync
的文件和目录调用来解决这个问题?
不要手动同步文件。使用该
--files-from=
选项来包含您的文本文件。目录规则:
/
/
或选项--recursive
/-r
或者如果你使用选项
-a
并且想要递归,你需要-r
额外添加。确保文件中的路径是相对于源目录的(有或没有前导/
)。您输入的一个最小示例是:
如果你需要事先修改/过滤文本文件,你可以将它从stdin传递到rsync,例如
让我们看看你的
rsync
命令。您省略了选项 - 这很重要 - 所以我假设您使用的是-a
(--archive
) 或-rt
(--recursive --times
),为了方便起见,我也会添加-v
(--verbose
)。您正在从此文本文件中读取源文件:
你有这个模板,文本文件中的每一行都被读入
$lr
:让我们将等效的行
f1
和应用d1
到您的模板化命令,看看我们有什么:直接我们可以看到,根据显示给我们的信息,文件
f1
不会被复制。相反,我们得到这个错误,如果您
f1
在目标中看到它一定是使用其他解决方案复制的,可能是早期尝试使用rsync
.同样,
d1
除非您已经创建了目录路径,否则不会被复制到目的地z/a/b/c
:你问题中的信息有些不对。如果我们忽略该
rsync
命令而专注于源数据集,则可以使用rsync
直接读取源数据集:这可能看起来有点奇怪,因为通常
-a
包括-r
. 但是,因为我们正在使用--files-from
并且您在源数据文件中指定了目录,所以我们需要-r
明确指定以告知rsync
递归到列出的源目录中。(没有这个你只会复制命名文件。)