使用 mv 将一个文件夹替换为另一个文件夹(不先删除目标文件夹)

Replace a folder with another folder using mv (without deleting target folder first)

我正在尝试用 directory 来替换现有的 folder 但无法用 mv 完成它 - 我相信有办法,但我只是不知道(还).即使查阅了手册页并搜索了网络。

如果/path/to/只包含directory,下面的命令会将/path/to/directory(消失)移动到/path/to/folder

mv /path/to/directory /path/to/folder

这基本上是重命名,这是我试图实现的。

但是如果 /path/to/folder 已经存在,相同的命令会将 /path/to/directory 移动到 /path/to/folder/directory

我不想使用 cp 命令来避免 IO。

不是使用cp实际复制每个文件中的数据,而是使用ln使[=52]的"copies" =]指向文件的指针。

ln /path/to/directory/* /path/to/folder && rm -rf /path/to/directory

请注意,这 比使用 cp 稍微 更原子化;每个单独的文件都在一个步骤中出现在 /path/to/folder 中(即 /path/to/folder/foo.txt 不可能被部分复制),但仍然有一个小的 window 其中一些,但不是全部,来自 /path/to/directory 的文件已 linked 到 folder. Also, therm -rfis not atomic, but assuming no one is interested in 目录, that's not an issue. (Although, as files from/path/to/directoryare unlinked, you *can* see changes to the link counts of files under/path/to/foldoer` 从 2 变为 1。不太可能有人会关心它。)


您认为的文件实际上只是文件系统管理的匿名文件的文件系统条目。例如,考虑一个简单的例子。

$ mkdir d
$ cd d
$ echo hello > file.txt
$ cp file.txt file_copy.txt
$ ln file.txt file_link.txt
$  ls -li
total 24
12890456377 -rw-r--r--  2 chepner  staff  6 Mar  3 12:46 file.txt
12890456378 -rw-r--r--  1 chepner  staff  6 Mar  3 12:47 file_copy.txt
12890456377 -rw-r--r--  2 chepner  staff  6 Mar  3 12:46 file_link.txt

-i选项将每个条目的索引节点号(第一列)添加到输出; inode 可以被认为是文件的唯一标识符。在此输出中,您可以看到 file_copy.txt 是一个全新的文件,其 inode 与 file.txt 不同。 file_link.txt 具有完全相同的索引节点,这意味着 file.txtfile_link.txt 只是同一事物的两个不同名称。所有者之前的数字是 link 计数file.txtfile_link.txt 都引用一个 link 计数为 2 的文件。

当您使用 rm 时,您只是将 link 删除到文件中,而不是文件本身。在 link 计数减少到 0 之前,文件不会被删除。为了演示,我们将删除 file.txtfile_copy.txt.

$ rm file.txt file_copy.txt
$ ls -li
total 8
12890456377 -rw-r--r--  1 chepner  staff  6 Mar  3 12:46 file_link.txt

可以看到,只有link到file_copy没有了,所以输出中不再出现inode 12890456378。 (数据是否 真的 消失是文件系统实现的问题。) file_link.txt 不过,仍然指的是与以前相同的文件,但现在有了link 计数为 1,因为 file.txt 已被删除。

文件链接不必出现在同一目录中;它们可以出现在同一 文件系统 的任何目录中,这是使用此技巧的唯一警告。 (ln 会,IIRC,如果你试图在另一个文件系统上创建一个 link 文件给你一个错误。)