我有以下文本文件
...
/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
如何对文件和目录使用上述相同的调用来解决这个问题?
答案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
让我们将等价的linesf1
和d1
应用于您的模板化命令,看看我们有什么:
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
递归到列出的源目录。 (如果没有这个,您将只能复制命名文件。)