2015-05-25 70 views
0

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

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

的问题是水珠似乎不包括内部"${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

我认为你必须定义ZDOTDIR赋予它像 ZDOTDIR =〜/ .dotfiles或类似成才的值,否则将zsh的$ HOME设置它。其他问题是:不要忘记在zsh而不是bash中执行该过程。 – SergioAraujo

回答

1

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

有关通配符和通配符限定符的更多信息,请参见man 1 zshexpn。或者在线的ZSH Documentation on Filename Generationhere is the subsection on Glob Qualifiers

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

所以这应该按预期工作:

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

非常好,非常感谢。我查找过有关'zsh'的扩展glob语法的信息,但找不到太多信息。你有链接到可以解释一切的东西吗? – KPthunder

+0

zsh有一个相当广泛的文档,您可以通过manpages('man zshall'来获取所有内容)或[online](http://zsh.sourceforge.net/Doc/)来访问它。我还添加了相关的链接到答案。 – Adaephon