我有以下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
也被排除在外,但我希望它(以及任何其他目录)被包含在内。
答案 0 :(得分:1)
用于循环的模式的globbing限定符(.
)中的(.N)
将匹配限制为普通文件(没有目录,没有符号链接等)。只需将其保留,它也会找到目录(或任何其他文件类型)。
有关globbing和globbing限定符的更多信息,请查看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