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

问题描述 投票:0回答:1

我试图让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。

bash shell command-line mv
1个回答
1
投票

而不是使用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, therm -rfis not atomic, but assuming no one is interested indirectory, 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.txtfile_link.txt只是两个不同的名称。所有者之前的数字是链接数; file.txtfile_link.txt都指向链接数为2的文件。

当您使用rm时,您只是删除文件的链接,而不是文件本身。在链接计数减少到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

如您所见,file_copy的唯一链接已消失,因此inode 12890456378不再出现在输出中。 (数据是否真的消失是文件系统实现的问题。)但是,file_link.txt仍然引用与以前相同的文件,但现在链接计数为1,因为file.txt被删除了。

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

© www.soinside.com 2019 - 2024. All rights reserved.