我想得到一个 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
来制作指向文件的指针的“副本”。
ln /path/to/directory/* /path/to/folder && rm -rf /path/to/directory
请注意,这比使用
cp
稍微更具原子性;每个单独的文件都在一个步骤中出现在 /path/to/folder
中(即,/path/to/folder/foo.txt
不可能被部分复制),但仍然有一个小窗口,其中一些(但不是全部)来自 /path/to/directory
的文件已链接到 folder. Also, the
rm -rf is not atomic, but assuming no one is interested in
目录 , that's not an issue. (Although, as files from
/path/to/directory are 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 编号(第一列)添加到输出;可以将 inode 视为文件的唯一标识符。在此输出中,您可以看到 file_copy.txt
是一个全新的文件,其 inode 与 file.txt
不同。 file_link.txt
具有完全相同的 inode,这意味着 file.txt
和 file_link.txt
只是同一事物的两个不同名称。所有者之前的数字是链接数; file.txt
和 file_link.txt
都指向链接数为 2 的文件。当您使用
rm
时,您只是删除文件的链接,而不是文件本身。在链接计数减少到 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
如您所见,指向
file_copy
的唯一链接消失了,因此 inode 12890456378 不再出现在输出中。 (数据是否真的消失是文件系统实现的问题。)尽管如此, file_link.txt
仍然引用与以前相同的文件,但现在链接计数为 1,因为 file.txt
已被删除。指向文件的链接不必出现在同一目录中;它们可以出现在同一文件系统的任何目录中,这是使用此技巧的唯一警告。 (如果您尝试创建指向另一个文件系统上的文件的链接,则
ln
将,IIRC,给您一个错误。)
关于bash - 使用 mv 将文件夹替换为另一个文件夹(无需先删除目标文件夹),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971503/