Автоматически символьные файлы каталогов в другой каталог
Каждый раз, когда я добавляю что-то ~/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
во всяком случае (по крайней мере, в моей ОС это было так).
Запустите / перезагрузите / перезагрузите демон и получайте удовольствие.