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

标签 bash shell command-line mv

我想得到一个 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/

相关文章:

xml - 使用 incron 和 bash 脚本调用 REST API?

linux - 仅针对错误消息自定义带有前缀的命令响应

java - powershell运行java进程问题

Linux FTP : Operation now in progress after restart/put

bash - wc 不返回整数值 - 应为整数表达式

linux - 如何按年龄快速统计目录中的文件/文件夹?

regex - 将电子邮件从文件文件夹提取到新文件

使用 XAMPP 运行的 mac os shell 脚本中发生 MYSQL mysqldump 错误

shell - bash : recursively copy and rename files

linux - 使用 xdg-open 别名打开是否安全