使用 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, the
rm -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.txt
和 file_link.txt
只是同一事物的两个不同名称。所有者之前的数字是 link 计数; file.txt
和 file_link.txt
都引用一个 link 计数为 2 的文件。
当您使用 rm
时,您只是将 link 删除到文件中,而不是文件本身。在 link 计数减少到 0 之前,文件不会被删除。为了演示,我们将删除 file.txt
和 file_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 文件给你一个错误。)
我正在尝试用 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, the
rm -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.txt
和 file_link.txt
只是同一事物的两个不同名称。所有者之前的数字是 link 计数; file.txt
和 file_link.txt
都引用一个 link 计数为 2 的文件。
当您使用 rm
时,您只是将 link 删除到文件中,而不是文件本身。在 link 计数减少到 0 之前,文件不会被删除。为了演示,我们将删除 file.txt
和 file_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 文件给你一个错误。)