【问题标题】:How to create a symbolic link when target directory doesn't exist?目标目录不存在时如何创建符号链接?
【发布时间】:2014-12-10 08:14:01
【问题描述】:

是否可以在ln 命令中添加一个标志来强制创建目标目录结构(如mkdir -p)。

考虑:

ln -s /Applications/'Sublime Text.app'/Contents/SharedSupport/bin/subl /usr/local/bin/

它为 Sublime Text 命令行工具添加了一个符号链接。但如果 /usr/local/bin/ 不存在,它会失败。

我尝试了-f 'force' 标志,但这没有帮助。

在运行ln 命令之前,您是否需要测试 /usr/local/bin/ 是否存在并创建它,或者是否有更好的方法来做到这一点?

【问题讨论】:

  • 文件路径是否代替了“${!#}”和“$@”?

标签: bash unix terminal


【解决方案1】:

这样试试,

mkdir -p  /create_your_path/ && xargs ln -s /link_file_path/file /create_your_path/

【讨论】:

  • 是的,我最终得出了这个结论。 mkdir -p 如果目录已经存在则无效,如果不存在则创建它,因此它运行良好。
  • xargs 管道是怎么回事? mkdir 不产生任何输出,因此到xargs 的管道只是mkdir -p target; ln -s source target 的一种非常晦涩的说法;并且您丢失了来自mkdir 的退出代码,因此如果目标不是目录或者您没有创建它的权限,您就不会失败。
  • 是的,xargs 在这里似乎没有意义。
  • 对 xargs 投了反对票,这在这里绝对是零意义
【解决方案2】:

不,ln 没有标准选项来创建缺少的目标目录。在ln 之前使用installmkdir -p,如果您发现不止一次需要它,可以在帮助脚本中使用。

#!/bin/bash -e
mkdir -p "${!#}"
exec ln -s "$@"

这显然不是很健壮,但如果你认为你真的觉得它有用,可以随意用更多的健全性检查来修饰它。

【讨论】:

  • ${!#} 是 Bash 功能,所以这是 #!/bin/bash 而不是 #!/bin/sh
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2014-08-06
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多