Каждый раз, когда я добавляю что-то в ~/config/
, я хочу, чтобы это было добавлено в ~
. Я не хочу запускать ln -s
каждый раз.
1 ответ
Есть утилита iwatch
, она может это сделать. В моем Ubuntu я установил пакет iwatch
, чтобы получить его. Он может использоваться в качестве демона или инструмента командной строки.
Я не могу гарантировать, что приведенные ниже решения надежны и хорошо написаны. Рассматривайте их как доказательство концепции.
Командная строка
В моих тестах мне не удавалось заставить один экземпляр самого iwatch
выполнять одно действие при создании файла, но другое действие при его удалении. Может быть, вы можете сделать это как-нибудь. Я решил вместо этого проанализировать его вывод, а затем решить (утверждение case
), что делать. Запустите это:
cd ~/config
iwatch -e create,moved_to,delete,moved_from -c "printf '%s %s\n' %e %f" ./ |
while read -r e f ; do
f="$(basename "$f")"
case $e in
*IN_CREATE|*IN_MOVED_TO)
ln -s "config/$f" "../$f"
;;
*IN_DELETE|*IN_MOVED_FROM)
test -L "../$f" && rm "../$f"
esac
done
Поиграйте с touch
, mkdir
, mv
, rm
и т.д. В ~/config
на другой консоли, чтобы проверить решение.
Заметки:
- Символьные ссылки создаются для новых файлов / каталогов, они удаляются при удалении целей;
mv
также покрыта. - Это хорошо работает для меня даже с такими проблемными именами, как
foo bar
илиa"b
. - Во время создания: если в
~/
уже есть объект, занимающий имя, тогда не будет создана символическая ссылка для его перезаписи - без потери данных. - При удалении: символические ссылки с собственными именами удаляются независимо от того, куда они указывают, несимвольные ссылки остаются нетронутыми благодаря
test -L …
.
демон
Демон iwatch
читает свой конфигурационный файл, вы можете сказать ему, что делать. У меня была проблема не только с определением двух разных действий, но и с экранированием некоторых символов в файле конфигурации. Самым простым решением было вызвать bash-скрипт для выполнения этой работы.
Прежде чем начать, обратите внимание:
- Пути должны быть абсолютными, измените их, чтобы они соответствовали вашему случаю.
- Также
USERNAME
необходимо изменить в файле конфигурации и в скрипте.
Это фрагмент для вставки в файл конфигурации (/etc/iwatch/iwatch.xml
в моей ОС) как раз перед </config>
:
<watchlist>
<title>symlinks</title>
<contactpoint email="USERNAME@localhost" name="USERNAME"/>
<path type="single" events="create,moved_to,delete,moved_from" alert="off" exec="/home/USERNAME/bin/link_config %e %f">/home/USERNAME/config</path>
</watchlist>
(Вы можете удалить watchlist
просмотра по умолчанию раздел, если таковые имеются).
Путь к сценарию:/home/USERNAME/bin/link_config
. Это быстрый и грязный скрипт:
#!/usr/bin/env bash
p="/home/USERNAME"
e="$1"
f="$(basename "$2")"
case "$e" in
*IN_CREATE|*IN_MOVED_TO)
ln -s "config/$f" "$p/$f"
;;
*IN_DELETE|*IN_MOVED_FROM)
[ -L "$p/$f" ] && rm "$p/$f"
esac
Я думаю, что если вы пропустите звездочки (*
) и оставите IN_CREATE
и т.д., Тогда скрипт будет игнорировать каталоги, созданные в /home/USERNAME/config
; Может быть, это то, что вам нравится больше. Это относится и к версии командной строки.
Сделайте скрипт исполняемым:
chmod u+x /home/USERNAME/bin/link_config
Установите другие разрешения, как вам нужно. Демон все равно будет запускать его как root
(по крайней мере, в моей ОС это было так).
Запустите / перезагрузите / перезагрузите демон и получайте удовольствие.