首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用shell重定向时创建父目录

使用shell重定向时创建父目录
EN

Unix & Linux用户
提问于 2022-01-30 07:23:02
回答 1查看 310关注 0票数 2

在Zsh中,以下操作失败:

代码语言:javascript
复制
$ echo hi > /tmp/this/path/does/not/exist/out.txt
zsh: no such file or directory: /tmp/this/path/does/not/exist/out.txt

显然,问题在于>不能创建缺少的父目录。我觉得这种行为很烦人,它应该只会造成脏。我怎样才能做到这一点?

对于cpmkdir这样的选项,只需对--parents选项进行别名就可以了。但是,>不能别名,因为它不是命令。我能做什么?

理想情况下,我希望在zsh中实现这一点,但我将接受“使用不同的shell”作为答案。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-01-30 20:31:42

您可以始终创建一个:

代码语言:javascript
复制
create() { mkdir -p -- $1:h && cat > $1; }

和使用:

代码语言:javascript
复制
echo something | create path/to/some/file

甚至:

代码语言:javascript
复制
create() {
  local dest
  for dest do
    mkdir -p -- $dest:h || return
  done
  cat > "$@"
}

为了能够做到:

代码语言:javascript
复制
echo hi | create some/file some/other/file

另一种方法:

代码语言:javascript
复制
makeparents() {
  mkdir -p -- $1:h
  print -r -- $1
}

和:

代码语言:javascript
复制
echo hi > "$(makeparents path/to/some/file)"

(对于以换行符结尾的文件名不起作用)

您还可以使用zsh的动态命名目录扩展来完成它:

代码语言:javascript
复制
redir-parent() {
  [[ $1 = n ]] && [[ $2 = p:* ]] || return
  local file=${2#p:}
  mkdir -p -- $file:h
  reply=($file)
}

zsh_directory_name_functions+=(redir-parent)

然后:

代码语言:javascript
复制
echo something > ~[p:path/to/some/file]

其中path/to/some将作为扩展的一部分创建。

无论如何,在所有这些情况下,当创建路径目录组件时,它们将具有受当前umask影响的默认权限。

cmd | create path/to/file版本中,即使无法创建/path/to或无法打开path/to/file (并且可能会被SIGPIPE杀死),也会运行D11

在其他情况下,失败的重定向将取消cmd的运行。他们还拥有保留cmdS退出地位的优势。

如果不能创建所有目录组件,或者不能打开文件进行写入,则即使重定向本身失败,也可能会创建某些目录。然后,您可能需要进行一些手动清理。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/688525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档