Czy folder jest dowiązaniem symbolicznym do dwóch folderów?

10

Chciałbym, aby domyślny folder muzyczny Ubuntu /home/$USER/Musicdziałał podobnie jak biblioteka w systemie Windows. Zasadniczo byłby to wirtualny folder zawierający zawartość innych folderów.

Moim uzasadnieniem jest to, że Rhythm Box będzie oglądać tylko jeden folder z nową muzyką. Cała moja muzyka znajduje się w dwóch folderach /home/$USER/Dropbox/Musici /home/$USER/Dropbox/New Music.

Jest to również przydatne do wyświetlania zawartości innych folderów Dropbox w domyślnych folderach Ubuntu (Dokumenty, Obrazy itp.).

Szukałem i próbowałem znaleźć odpowiedź bezskutecznie. Jestem pewien, że istnieje sposób na osiągnięcie tego; Po prostu mi tego brakuje.

Z góry dziękuję.

DanTheManDRH
źródło
1
Istnieje możliwość powiązania 2 folderów razem: sudo mount --bind olddir newdirale prawdopodobnie nie jest to dokładnie to, czego szukasz ...
andrew.46
@ andrew.46 mount --bindumożliwia dostęp do jednego zestawu folderów z dwóch różnych punktów montowania. OP chce uzyskać dostęp do dwóch zestawów folderów z jednego punktu montowania
EdiD
@Edid: Ups, oczywiście masz całkowitą rację ... przepraszam za hałas ...
andrew.46
Mógłbym wymyślić jakiś sposób, ale wymagałoby to małego skryptu w tle. Czy byłoby to do przyjęcia?
Jacob Vlijm
@JacobVlijm Nie mów mi, że skrypt sprawdzi, czy jakiś plik jest dostępny w katalogu, a następnie skopiuje do dwóch miejsc docelowych.
heemayl

Odpowiedzi:

8

Skryptowane rozwiązania

1. Automatycznie aktualizowany widok biblioteki

Za pomocą skryptu w tle poniżej możesz skonfigurować katalog, wirtualnie pokazujący połączoną zawartość dowolnej liczby innych folderów.

Zawartość folderu (istniejącego dowiązań symbolicznych) jest dynamicznie synchronizowana ze (połączonymi) źródłami.

Jak to działa

Skrypt okresowo wyświetla zawartość folderów źródłowych, a także folder docelowy dla widoku „biblioteki”.

  • Jeśli w jednym z folderów źródłowych znajdują się elementy, które nie istnieją w bibliotece, w bibliotece zostanie utworzone dowiązanie symboliczne.
  • jeśli w bibliotece znajdują się elementy, które nie istnieją w żadnym folderze źródłowym (w rzeczywistości uszkodzony link), element jest usuwany z biblioteki.

wprowadź opis zdjęcia tutaj

Porównywanie list jest wyjątkowo lekkie (programowo) i mało zasobne. Testowałem skrypt z dużo szybszą pętlą niż w poniższym skrypcie, z liczbą elementów około 500 na jednym poziomie katalogu, bez żadnego dodatkowego (zauważalnego) obciążenia.

Skrypt i jak go używać

#!/usr/bin/env python3
import os
import sys
import time

# --- set loop time below (or leave it as it is)
loop = 5
# ---
# don't change anything below

target = sys.argv[1]
sources = sys.argv[2:]

while True:
    currlinks = os.listdir(target)
    compare = []
    for dr in sources:
        for f in os.listdir(dr):
            compare.append(f)
            if not f in currlinks:
                # create link
                os.symlink(dr+"/"+f, target+"/"+f)
    # clean up possible broken links
    for link in currlinks:
        if not link in compare:
            os.remove(target+"/"+link)
    # loop time
    time.sleep(loop)
  1. Skopiuj skrypt do pustego pliku i zapisz go jako library_view.py
  2. Testuj - uruchom skrypt z docelowym katalogiem, aby zobaczyć połączone katalogi jako pierwszy argument , katalogi źródłowe jako kolejne argumenty, np .:

    python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
    

    Ta komenda pokaże zawartość folderów source1i source2in virtual_library.

  3. Jeśli wszystko działa poprawnie, dodaj go do aplikacji startowych: Dash> Aplikacje startowe> Dodaj. Dodaj polecenie:

    python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
    

Uwaga

Jak wspomniano, możesz dodać więcej niż dwa katalogi soure, jeśli chcesz.

2. Wersja ręczna

Jeśli z jakiegoś powodu nie chcesz używać skryptu w tle, możesz ręcznie zaktualizować (zsynchronizować) folder biblioteki, używając dokładnie tego samego polecenia pod klawiszem skrótu, używając poniższego skryptu:

#!/usr/bin/env python3
import os
import sys

target = sys.argv[1]
sources = sys.argv[2:]

currlinks = os.listdir(target)
compare = []
for dr in sources:
    for f in os.listdir(dr):
        compare.append(f)
        if not f in currlinks:
            # create link
            os.symlink(dr+"/"+f, target+"/"+f)
# clean up possible broken links
for link in currlinks:
    if not link in compare:
        os.remove(target+"/"+link)

Wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie do wybranej kombinacji klawiszy:

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
Jacob Vlijm
źródło
Jacob, naprawdę muszę ci podziękować za wszystko i napisanie dla mnie scenariusza. Teraz muszę go użyć, wykonałeś pracę. :-). Spróbuję to w weekend. Wielkie dzięki.
DanTheManDRH
1
@DanHutter Thanks! Mam nadzieję, że ci się spodoba. Jeśli coś jest, proszę dać mi znać.
Jacob Vlijm
Cześć Jacob, właśnie uaktualniłem do Ubuntu Gnome 16.10 ten skrypt nadal działa idealnie. Obecnie używam go do muzyki, zdjęć i dokumentów! Jeszcze raz dziękuję.
DanTheManDRH,
@DanHutter Dzięki za wzmiankę, że tak dobrze słyszeć!
Jacob Vlijm,
3

Możesz zainstalować unionfs-fusedo tego:

sudo apt-get install unionfs-fuse 

Montowanie:

unionfs-fuse /folder1=RW:/folder2=RW /mount/point

To będzie grupa cała zawartość od folderze folder1 i folderze folder2 (lub więcej, jeśli chcesz) jest punktem podłączenia

Umounting:

sudo umount /mount/point
EdiD
źródło