递归复制和覆盖目录

use*_*856 6 command-line

我有一个名为“existing_folder”的目录和另一个名为“temp”的目录

我想用 'temp' 的内容以及任何子目录替换 'existing_folder' 的内容。

由于该目录包含网页,因此必须以确保最少停机时间的方式完成此操作。

有没有办法做到这一点?我应该使用什么命令来实现这一目标?

小智 12

你试过rsync吗?

根据您的要求,我认为它是最好的工具。它将仅替换更改的文件,复制新的文件,并且可以删除原始文件。

$ rsync -av --delete temp/ existing_folder/
Run Code Online (Sandbox Code Playgroud)

注意 temp 后面的斜杠,它是必需的,因为您要同步内容。没有它,它会在现有文件夹中创建一个目录临时文件。

delete 参数使不再在 temp 中的文件在 existing_folder 中被删除。

如果添加 -n 参数,您也可以进行试运行。它会告诉您无需执行任何操作即可完成哪些更改。


ter*_*don 8

如果orig_foldertemp都在同一个物理硬盘上,重命名(移动)它们基本上是即时的。这意味着你可以简单地做

mv orig_folder foo && mv temp orig_folder && rm -rf foo
Run Code Online (Sandbox Code Playgroud)

这将重命名orig_folderfoo,然后重命名temporig_folder,最后删除foo。在同一个文件系统上,这两个mv操作几乎不需要时间(在我的系统上为 0.004 秒)。

如果源目录和目标目录不在同一个文件系统上,为了尽量减少文件不可用的时间,您首先需要将源目录移动到同一个文件系统,然后重命名:

mv /path/to/temp . && mv orig_folder foo && mv temp orig_folder && rm -rf foo
Run Code Online (Sandbox Code Playgroud)