我试图让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 -rfis not atomic, but assuming no one is interested in
directory, 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编号(第一列)添加到输出中;可以将inode视为文件的唯一标识符。在此输出中,您可以看到file_copy.txt
是一个全新的文件,其中包含与file.txt
不同的inode。 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会给您一个错误。)