Автоматично символічні файли каталогів в інший каталог


1

У будь-який час я додаю щось ~/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(принаймні в ОС це було так).

Почніть / перезавантажте / перезавантажте демон і отримайте задоволення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.