zsh - 在glob循环

时间:2015-05-25 19:04:46

标签: zsh glob

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

1 个答案:

答案 0 :(得分:1)

用于循环的模式的globbing限定符(.)中的(.N)将匹配限制为普通文件(没有目录,没有符号链接等)。只需将其保留,它也会找到目录(或任何其他文件类型)。

有关globbing和globbing限定符的更多信息,请查看man 1 zshexpn。或者在ZSH Documentation on Filename Generationhere 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