为什么 mkdir 默认没有设置 -p 标志以允许创建嵌套目录?

Tre*_*non 11 command-line

我认为没有理由不应该默认设置-p标志mkdir

  -p, --parents     no error if existing, make parent directories as needed
Run Code Online (Sandbox Code Playgroud)

从我所见,这是一个非破坏性命令。我是否错过了有关其工作方式的重要内容?

其次,是否有一种简单的方法可以将其设为mkdir?

ktf*_*ktf 16

当然,有人可能会争辩说,父目录的创建应该是默认的,如果父目录不存在,可以使用一些检查选项来阻止目录的创建。

但相反的原因只是历史。mkdir的基本版本没有创建父目录。这就是为什么 X11 发行版带有一个名为mkdirhier的命令能够完成这个任务:检查父目录是否存在并在必要时创建它们。

后来这个功能被添加到许多 UNIX 版本的命令mkdir 中(我不知道现在是否在 POSIX 标准中)。为了保持兼容性,通过打开选项标志使此功能可用:-p

为什么默认情况下打开它很糟糕?如果父目录不存在,脚本可能依赖于mkdir失败。特别是作为root用户,默认情况下创建目录树可能很危险。

例子:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...
Run Code Online (Sandbox Code Playgroud)

在此示例中,即使文件系统/backup未安装且父项/backup/$(uname -n)不存在,如果默认情况相反,将创建目录并执行备份。

经验法则:最好不要更改任何工具的默认行为。如果需要,请提供允许更改默认行为的选项。

  • 我喜欢你在这里使用的安装示例。我没有想到那个特定的场景。 (2认同)

roz*_*acz 6

这是一个可选功能,并不总是需要的 - 特别是在脚本中。对于脚本,请考虑以下缺点:

  • 没有报告目录已经存在的事实:如果脚本应该将一些文件放在新创建的目录中,而该目录已经存在并包含文件,则脚本可能会造成很多混乱。(稍后过滤掉脚本放置在那里的文件会很麻烦。)
  • 与上述相反,某些脚本(或其中的一部分)可能依赖于之前创建的目录结构(可能由其他包/脚本)。例如,包安装脚本可能需要将库放在 subdir 中/usr/local/lib/GreatSoftware/ImportantPartOfIt,但这些库依赖于 / 链接到/usr/local/lib/GreatSoftware. 如果缺少此项,则脚本不应继续。

的通用行为mkdir使它变得容易和自然,因为这种情况会被报告并且可以立即被发现。


如果您想始终mkdir -p在 shell 中使用,您可以为其创建别名:

alias mkdir='mkdir -p'
Run Code Online (Sandbox Code Playgroud)

(这应该转到您的.bashrc或您的 shell 使用的任何配置。)

  • @jlliagre 不,它不会影响脚本。`.bashrc` 中本地定义的别名(通常)不会影响它们的环境。 (2认同)