gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:47:55 28 4
gpt4 key购买 nike

我想得到一个 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.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,给您一个错误。)

关于bash - 使用 mv 将文件夹替换为另一个文件夹(无需先删除目标文件夹),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971503/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com