如何将目录同步到具有不同名称的新目录?


48

我正在进行数据传输,旧文件系统深深依赖于现在位于不同路径的目录。这是一个git目录,用于在线存储代码。我无权移动或重命名它。

所以我可以做的是将该目录rsync到相同的旧路径。但是目录名称也已更改。

有没有一种简单的方法可以将目录同步到名称不同的目标目录?

Answers:


82

如果要用于rsync递归地使dest目录成为目录的精确副本,请执行以下操作src

rsync -a src/ dest

rsync手册页介绍了如何工作的:

源上的斜杠避免在目标上创建附加目录级别。您可以/将源上的结尾视为“复制此目录的内容”,而不是“按名称复制目录” [...]


3
这将创建一个src目录下的dest目录

7
@Zen,rsync我从未使用过任何版本。如果您确实发生了这种情况,那么您将在源目录参数末尾缺少斜杠。
阿德里安

3
偷偷摸摸的尾随斜杠是关键...
tutuca

不幸的destsrc,如果这是一个符号,这似乎不起作用,而是最终复制srcsrc/src。在macOS上测试。希望我可以替换bar -> foo/bar/,但必须使用中间临时目录。
user5359531

@ user5359531如果您知道这dest是的符号链接src,只需rm dest在运行上述命令之前。在复制内容之前rsync足够智能。您不需要中间的临时目录。destsrc
阿德里安

1

如果您的计算机都可以访问旧文件系统和新文件系统,请考虑使用符号链接而不是rsync。如果您使用的rsync命令未指定主机(或者它们是同一主机),则属于这种情况。您试图在同一主机上镜像两个名称不同的目录。请勿为此使用rsync,因为您正在复制数据,因此必须经常运行rsync才能使其保持同步。

使用符号链接是一种一次性修复,它将镜像两个目录(名称不同)并且几乎不需要空间。就像创建一个别名目录指向另一个目录一样。

假设您的旧git位于名为/ old / path / old_git的目录中,现在代码存储库已移至/ new / path / new_git

你可以做:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

这样将创建一个链接:

/ old / path / old_git-> / new / path / new_git

这样,放入new_git的所有内容也将以旧方式立即可用,而无需复制数据,也不必不断同步它们。


1
小心rm -rf old_git命令。这将删除整个old_git存储库。如果我不正确地理解您的问题,那可能是一件坏事。
jrel 2015年

0

我现在找到替代解决方案。

使用rysnc -r /origin/* /target/可以将所有内容从原始目录同步到目标目录。


8
我相信这不包括点(.foo)文件,因为这些文件不会与星号匹配
Ray Burgemeestre'Aug

它依赖于shell glob扩展,从技术上讲,它将把在那里找到的每个文件作为参数传递给rsync。它和跑步几乎一样rsync -r $(find /origin -maxdepth 1 -type f) /target/ 。正如@RayBurgemeestre指出的那样,shell glob扩展将不包含点文件。
弗洛里安·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.