【发布时间】:2019-07-25 01:44:33
【问题描述】:
我正在尝试用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。
【问题讨论】:
-
可能是:
{ rm -rf /path/to/folder; mv /path/to/directory /path/to/folder; } -
我知道我可以先像这样
mv folder moved && mv directory folder && rm -r moved将目标移开,但我认为这是不必要的黑客攻击,会让我有一个文件夹不存在的时刻——这是我想要避免的. -
没有捷径;目录和文件之间存在根本差异,您不能像这样一步覆盖一个文件夹。不过,一个重要的问题是,如果
/path/to/folder暂时不存在,为什么这很重要? -
假设
folder和directory在同一个文件系统上,但是您可以简单地使用ln而不是cp来最小化I/O。ln /path/to/directory/* /path/to/folder && rm -rf /path/to/directory. -
简而言之,
ln <source> <target>创建一个新目录条目<target>,它引用与<source>相同的底层文件。两个名字都不是一个“真实”的名字。两者都引用链接计数为 2 的文件。事实上,rm实际上并没有删除文件;它只是删除文件的 link。文件系统负责收集没有更多链接的垃圾文件。
标签: bash shell command-line mv