覆盖现有目录?

nux*_*nux 13 command-line backup directory mkdir

我有一个foo位于~/Desktop. 假设我想从具有相同名称和相同位置的终端创建一个目录。当我尝试时,mkdir它给出了一个错误:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
Run Code Online (Sandbox Code Playgroud)

这是有道理的,但foo如果存在,我想替换。我看了一遍,man mkdir但没有任何选项可以做到这一点。

那么如何覆盖foo目录呢?

为什么没有mkdir选择这样做?

Eli*_*gan 25

如果您的目标是执行单行命令:

  • ~/Desktop/foo如果目录已经存在,则删除并重新创建该目录。
  • ~/Desktop/foo如果目录不存在,则创建该目录。

然后你可以使用:

rm -r ~/Desktop/foo; mkdir ~/Desktop/foo
Run Code Online (Sandbox Code Playgroud)

; 相当于换行符,但它允许您在一行上执行多个命令(即,作为“单个命令”)。

  • 如果您要删除的目录可能包含只读文件,您将需要该-f标志来删除它们而不以交互方式提示用户。这没关系,但我建议特别小心使用rm -rf .... 详情请参阅man rm
  • 你需要的rm命令来完成的前mkdir命令执行; 这就是使用;而不是的原因&。(前面的命令&在后台异步运行。)
  • 您需要在命令成功mkdir时运行该rm命令;这就是使用;而不是的原因||
  • 您需要在mkdir命令rm失败时运行该命令(通常失败意味着目录不存在);这就是使用;而不是的原因&&
  • rm即使目录已经存在,该命令也可能会失败,在这种情况下,该mkdir命令也会失败,但错误消息是有意义的,并且foo在尝试创建它之前可能不需要添加检查's 存在的中间步骤。

有关、、 和运算符的更多信息和说明,请参阅Bash 参考手册中的3.2.3 命令列表;&||&&

正如muru 建议的(和Rinzwind 详细阐述的),我建议您研究一下rsync它是否能满足您的备份需求。在rsync 文档页面以及这个 Ubuntu rsync指南上还有一些其他有用的指南。

为什么 mkdir 没有这个选项?

mkdir创建目录(“mk”代表“make”)。因为它也递归地删除目录和其中的所有文件将是不好的,因为它会以可能导致数据丢失的方式违反最小惊讶原则

rmdir甚至不删除包含任何(非目录)文件的目录。rm有一个-r选项,这是有道理的,因为rm期望删除文件(这是它的目的,因此固有的危险是直观的,用户通常知道在运行rm命令时要小心)。


mur*_*uru 7

不,没有单一的命令可以执行您的要求。

为什么?

这就是 Unix 的哲学:编写只做一件事并把它做好的程序。编写程序以协同工作。1

在这种情况下,mkdirrm命令执行您的要求,并且可以很好地协同工作,因为rm -r也会删除目录,因此后续mkdir将创建目录。

1 The Art of Unix Programming , Eric S. Raymond,本身引用了 Doug McIlroy。