Automatycznie dowiązuj pliki katalogu do innego katalogu

1

Zawsze, gdy coś dodam ~/config/, Chciałbym, żeby zostało to połączone ~. Nie chcę uciekać ln -s każdego razu.

Hatshepsut
źródło

Odpowiedzi:

1

Jest iwatch narzędzie, może to zrobić. W moim Ubuntu zainstalowałem iwatch pakiet, aby go zdobyć. Może być używany jako demon lub narzędzie wiersza poleceń.

Nie mogę zagwarantować, że poniższe rozwiązania są niezawodne i dobrze napisane. Traktuj je jako dowód koncepcji.

Wiersz poleceń

W moich testach nie udało mi się zrobić pojedynczej instancji iwatch sama wykonuje jedną akcję, gdy plik jest tworzony, ale inna akcja, gdy jest usuwana. Może możesz to jakoś zrobić. Postanowiłem zamiast tego przeanalizować jego wynik, a następnie zdecydować ( case oświadczenie) co robić. Uruchom to:

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

Bawić się touch, mkdir, mv, rm itp. w ~/config w innej konsoli, aby przetestować rozwiązanie.

Uwagi:

  • Dowiązania symboliczne są tworzone dla nowych plików / katalogów, są usuwane po usunięciu celów; mv jest również objęty.
  • To działa dobrze dla mnie nawet z nieco kłopotliwymi nazwami, takimi jak foo bar lub a"b.
  • Podczas tworzenia: jeśli jest już obiekt ~/ zajmując nazwę, żadne dowiązanie symboliczne nie zostanie utworzone, aby je zastąpić - brak utraty danych.
  • Podczas usuwania: dowiązania symboliczne z nazwami własnymi są usuwane bez względu na to, dokąd wskazują, nieliniowe linki pozostają nienaruszone dzięki test -L ….

Daemon

The iwatch demon odczytuje swój plik konfiguracyjny, możesz powiedzieć mu, co robić. Nie tylko miałem problem z zdefiniowaniem dwóch różnych akcji, ale także z unikaniem niektórych znaków w pliku konfiguracyjnym. Najłatwiejszym rozwiązaniem było wywołanie skryptu bash, aby wykonać zadanie.

Zanim zaczniesz, zauważ:

  • Ścieżki powinny być bezwzględne, modyfikuj je, aby pasowały do ​​Twojego przypadku.
  • Również USERNAME musi zostać zmodyfikowany w pliku konfiguracyjnym i skrypcie.

To jest fragment kodu, który należy wkleić do pliku konfiguracyjnego ( /etc/iwatch/iwatch.xml w moim systemie operacyjnym) tuż przed </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>

(Możesz usunąć domyślne watchlist sekcja, jeśli istnieje.)

Ścieżka do skryptu to /home/USERNAME/bin/link_config. To szybki i brudny skrypt:

#!/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

Myślę, że jeśli pominiesz gwiazdki ( * ) i zostawcie gołą IN_CREATE itd. wtedy skrypt zignoruje katalogi utworzone w /home/USERNAME/config; może to jest to, co lubisz bardziej. Dotyczy to również wersji wiersza poleceń.

Ustaw skrypt jako wykonywalny:

chmod u+x /home/USERNAME/bin/link_config

Ustaw inne uprawnienia, jak potrzebujesz. Demon uruchomi go jako root w każdym razie (przynajmniej w moim systemie operacyjnym tak było).

Uruchom / uruchom ponownie / ponownie załaduj demona i baw się dobrze.

Kamil Maciorowski
źródło