Зробити папку символічним посиланням на дві папки?


10

Я хотів би, щоб музична папка Ubuntu за замовчуванням /home/$USER/Musicдіяла приблизно так, як би використовувала бібліотека в Windows. По суті це буде віртуальна папка, що містить вміст інших папок.

Моє обгрунтування - Rhythm Box буде дивитися лише одну папку для нової музики. Вся моя музика знаходиться в двох папках /home/$USER/Dropbox/Musicі /home/$USER/Dropbox/New Music.

Це також виявляється корисним для показу вмісту інших папок Dropbox у папках за замовчуванням Ubuntu (Документи, Зображення тощо).

Я шукав і намагався самостійно знайти відповідь. Я впевнений, що є спосіб досягти цього; Мені це просто не вистачає.

Заздалегідь спасибі.


1
Є можливість зв'язати 2 папки разом із: sudo mount --bind olddir newdirале це, мабуть, не зовсім те, що ви шукаєте ...
andrew.46

@ andrew.46 mount --bindдозволяє отримати доступ до одного набору папок із двох різних точок монтажу. ОП хоче отримати доступ до двох папок з однієї точки кріплення
EdiD

@Edid: На жаль, ви, безумовно, правильні ... Вибачте за шум ...
andrew.46,

Я міг би придумати спосіб, але для цього знадобиться невеликий фоновий сценарій. Це було б прийнятно?
Яків Влійм

@JacobVlijm Будь ласка, не кажіть мені, що сценарій перевірить, чи є якийсь файл у каталозі, а потім скопіювати на два напрямки.
heemayl

Відповіді:


8

Сценарійне рішення

1. Автоматично оновлюється подання бібліотеки

За допомогою фонового сценарію нижче ви можете налаштувати каталог, практично показуючи комбінований вміст довільної кількості інших папок.

Вміст папки (що існує із символьних посилань) динамічно синхронізується з (комбінованими) джерелами.

Як це працює

Сценарій періодично перераховує вміст папок-джерел, а також цільову папку для перегляду «бібліотека».

  • Якщо в будь-якій з вихідних папок є елементи, які не існують у бібліотеці, в бібліотеці буде створено символьне посилання.
  • якщо в бібліотеці є елементи, які не існують ні в одній із вихідних папок (насправді недійна посилання), елемент видаляється з бібліотеки.

введіть тут опис зображення

Порівняння списків надзвичайно мало (програмно) та мало ресурсів. Я протестував сценарій набагато швидше циклу, ніж у сценарії нижче, з кількістю елементів близько 500 на одному рівні каталогу, без додаткового (помітного) завантаження.

Сценарій та способи використання

#!/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. Скопіюйте скрипт у порожній файл, збережіть його як library_view.py
  2. Тестуйте запуск сценарію з цільовим каталогом, щоб переглянути комбіновані каталоги в якості першого аргументу у вихідних каталогах як наступні аргументи, наприклад:

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

    Ця команда покаже вміст папок source1і source2в virtual_library.

  3. Якщо все працює нормально, додайте його до запуску програм: Dash> Startup Applications> Add. Додайте команду:

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

Примітка

Як вже було сказано, ви можете додати більше, ніж два каталоги на soure, якщо хочете.

2. Ручна версія

Якщо ви хочете з якихось причин не використовувати фоновий скрипт, ви можете вручну оновити (синхронізувати) папку бібліотеки з точно такою ж командою під клавішею швидкого доступу, використовуючи нижченаведений сценарій:

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

Виберіть: Налаштування системи> "Клавіатура"> "Ярлики"> "Спеціальні ярлики". Клацніть "+" і додайте команду yo комбінацію клавіш на ваш вибір:

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

Якове, я справді повинен подякувати тобі за те, що ти все вийшов і написав для мене сценарій. Тепер я маю його використовувати, ви зробили роботу. :-). Я дам це зняти у вихідні. Дуже дякую.
DanTheManDRH

1
@DanHutter Дякую! Сподіваюся, вам сподобається. Якщо є що-небудь, будь ласка, дайте мені знати.
Яків Влійм

Привіт Якоб, щойно я перейшов на Ubuntu Gnome 16.10, цей сценарій все ще працює чудово. Наразі використовується його для музики, фотографій та документів! Ще раз дякую вам.
DanTheManDRH

@DanHutter Дякую за згадування, що так добре чути!
Яків Влійм

3

Ви можете встановити unionfs-fuseдля цього:

sudo apt-get install unionfs-fuse 

Монтаж:

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

Він згрупує весь вміст з папки1 та папки2 (або більше, якщо ви хочете) до точки монтажу

Вимальовування:

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