【问题标题】:zsh - Include directories in glob loopzsh - 在 glob 循环中包含目录
【发布时间】:2015-05-27 02:14:00
【问题描述】:

我有以下 zsh 脚本,它将给定目录中的所有文件(README.md 除外)符号链接到我的主目录,每个文件名前面都有一个前导 .

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.dotfiles/home/^README.md(.N); do
  ln -fsv "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

问题是 glob 似乎不包含 "${ZDOTDIR:-$HOME}"/.dotfiles/home/ 内的任何目录,只是常规文件。如何在此循环中包含目录(例如,目录/Users/user/.dotfiles/home/vim 符号链接到/Users/user/.vim)?我用find 尝试了一些东西,但如果可能的话,我更愿意坚持纯zsh 脚本。

作为参考,这里是这个目录的列表:

README.md
gitconfig
tmux.conf
vim
vimrc
zlogin
zprofile
zshenv
zshrc

这是循环每次迭代的值:

/Users/user/.dotfiles/home/gitconfig
/Users/user/.dotfiles/home/tmux.conf
/Users/user/.dotfiles/home/vimrc
/Users/user/.dotfiles/home/zlogin
/Users/user/.dotfiles/home/zprofile
/Users/user/.dotfiles/home/zshenv
/Users/user/.dotfiles/home/zshrc

所以README.md 被排除在外,正如我的意图,但vim 也被排除在外,但我希望它(和任何其他目录)被包括在内。

【问题讨论】:

  • 我认为你必须定义 ZDOTDIR 为它分配一个像 ZDOTDIR=~/.dotfiles 或类似的值,否则 zsh 会将 $HOME 设置为它。另一个问题是:不要忘记在 zsh 而不是 bash 中执行该过程。

标签: zsh glob


【解决方案1】:

用于循环的模式的通配符限定符 ((.N)) 中的 . 将匹配限制为纯文件(无目录、无符号链接等)。不用管它,它也会找到目录(或任何其他文件类型)。

有关通配符和通配符限定符的更多信息,请查看man 1 zshexpn。或在线ZSH Documentation on Filename Generation (here is the subsection on Glob Qualifiers)

您还需要将选项-n 添加到ln,否则符号链接将被放入链接目录而不是覆盖链接本身。

所以这应该可以按预期工作:

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.dotfiles/home/^README.md(N); do
  ln -fsnv "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

【讨论】:

  • 非常好,非常感谢。我四处寻找有关zsh 的扩展glob 语法的信息,但找不到太多信息。你有可以解释一切的链接吗?
  • zsh 有一个相当广泛的文档,您可以作为手册页访问(man zshall 一次获取所有内容)或online。我还添加了答案的相关链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多