2015-05-25 4 views
0

У меня есть следующий скрипт zsh, который символизирует все файлы в данном каталоге (кроме README.md) в моем домашнем каталоге с ведущим . перед каждым именем файла.zsh - Включить каталоги в glob loop

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

Я думаю, вы должны определить ZDOTDIR присвоив ему значение, как ZDOTDIR = ~/.dotfiles или аналогичный коснуться, в противном случае ЗШ установит $ HOME на него. Другая проблема: не забудьте сделать процедуру в zsh вместо bash. – SergioAraujo

ответ

1

. в шаблоне globeing ((.N)) шаблона, который вы используете для своего цикла, ограничивает совпадения равными файлами (без каталогов, без символических ссылок и т. Д.). Просто оставьте это, и он также найдет каталоги (или любой другой тип файла).

Для получения дополнительной информации о классификаторах подгонки и глобулизации см. 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 
+0

Отлично, большое спасибо. Я просмотрел информацию о расширенном синтаксисе glob zsh, но не смог найти много информации. У вас есть ссылка на то, что может объяснить все? – KPthunder

+0

zsh имеет довольно обширную документацию, в которую вы можете либо получить доступ как manpages ('man zshall', чтобы получить все сразу), либо [онлайн] (http://zsh.sourceforge.net/Doc/). Я также добавил соответствующие ссылки на ответ. – Adaephon

Смежные вопросы