Автоматически символьные файлы каталогов в другой каталог

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

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

Другие вопросы по тегам