1

Каждый раз, когда я добавляю что-то в ~/config/ , я хочу, чтобы это было добавлено в ~ . Я не хочу запускать ln -s каждый раз.

1 ответ1

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 (по крайней мере, в моей ОС это было так).

Запустите / перезагрузите / перезагрузите демон и получайте удовольствие.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .