递归复制并覆盖目录

递归复制并覆盖目录

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

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

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

有办法吗?我应该使用什么命令来实现这一点?

答案1

你有没有尝试过同步

从您的要求来看,我认为这是最好的工具。它只会替换已更改的文件,复制新文件,并可以删除原版中已消失的文件。

$ rsync -av --delete temp/ existing_folder/

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

删除参数使得不再存在于临时文件夹中的文件被从现有文件夹中删除。

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

答案2

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

mv orig_folder foo && mv temp orig_folder && rm -rf foo

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

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

mv /path/to/temp . && mv orig_folder foo && mv temp orig_folder && rm -rf foo

答案3

结合接受的答案这里使用命令将一个目录复制到另一个目录,以下命令应该可以完成这项工作:

rm -rfv <existing_folder>/* && cp -r <temp>/* <existing_folder>

但是,正如链接中的答案所说,请注意:

  • /*部分非常重要。如果你在 之前加了一个空格*,它将删除当前目录中的所有文件。
  • 这不会删除隐藏文件
  • “在使用 时要非常小心rm-r并且*都使用同一个命令。它们可能是一个灾难性的组合。”

相关内容