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
我有以下 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