zsh - 在 glob 循环中包含目录

zsh - Include directories in glob loop

我有以下 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 也被排除在外,但我希望它(和任何其他目录)被包括在内。

您在循环中使用的模式的通配限定符 ((.N)) 中的 . 将匹配限制为纯文件(无目录、无 symlinks 等.).只需将其保留,它还会查找目录(或任何其他文件类型)。

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

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

所以这应该按预期工作:

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