rsync 没有按照我想要的方式创建目标文件夹

rsync 没有按照我想要的方式创建目标文件夹

我有以下文本文件

...
/a/b/c/f1
/a/b/c/f2
...
/a/b/c/d1
...

其中f1f2是文件,而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如何对文件和目录使用上述相同的调用来解决这个问题?

答案1

不要手动 rsync 文件。使用该--files-from=选项来包含您的文本文件。

目录规则:

  • 如果路径不以尾随结尾,则仅创建目录/
  • 要同步目录的内容,请添加尾随/或选项--recursive/-r或者

如果使用option-a并且想要递归,则需要-r另外添加。确保文件中的路径相对于源目录(带或不带前导/)。

您输入的一个最小示例是:

rsync --files-from=textfile / /z

如果您需要事先修改/过滤文本文件,您可以将其从 stdin 传递到 rsync,例如

your_command textfile | rsync --files-from=- / /z

答案2

让我们看看你的rsync命令。您省略了选项 - 这很重要 - 所以我假设您使用的是-a( --archive) 或-rt( --recursive --times),为了方便起见,我也会添加-v( --verbose)。

您正在从此文本文件中读取源文件:

/a/b/c/f1
/a/b/c/f2
...
/a/b/c/d1

您有这个模板,其中文本文件中的每一行都被读入$lr

rsync $lr/ /z/$lr

让我们将等价的linesf1d1应用于您的模板化命令,看看我们有什么:

mkdir -p /tmp/733765
cd /tmp/733765
mkdir -p a/b/c/d1
touch a/b/c/{f1,f2,d1/f3} z

rsync -av a/b/c/f1/ z/a/b/c/f1
rsync -av a/b/c/d1/ z/a/b/c/d1

我们可以立即看到,根据向我们显示的信息,文件 f1不会被复制。相反,我们得到这个错误,

rsync: [sender] change_dir "/tmp/733765/a/b/c/f1" failed: Not a directory (20)

如果您f1在目标中看到它一定是使用其他解决方案复制的,也许是早期尝试使用rsync.

同样,d1除非您已经创建了目录路径,否则不会复制到目标z/a/b/c

rsync: [Receiver] mkdir "/tmp/733765/z/a/b/c/d1" failed: No such file or directory (2)

mkdir -p z/a/b/c
rsync -av a/b/c/d1/ z/a/b/c/d1

created directory z/a/b/c/d1
./
f3

sent 122 bytes  received 71 bytes  128.67 bytes/sec

您问题中的信息有些不正确。如果我们忽略该rsync命令并专注于源数据集,则可以使用rsync直接读取源数据集:

rsync --files-from /path/to/source_data_file -arv . z/

这可能看起来有点奇怪,因为通常-a包括-r.但是,因为我们正在使用--files-from并且您在源数据文件中指定了目录,所以我们需要-r显式指定以告诉rsync递归到列出的源目录。 (如果没有这个,您将只能复制命名文件。)

相关内容