Сделать папку символической ссылкой на две папки?

Я хотел бы, чтобы папка музыки Ubuntu по умолчанию /home/$USER/Music работала так же, как библиотека в Windows. По сути, это будет виртуальная папка с содержимым других папок.

Мое обоснование: Rhythm Box будет смотреть только одну папку для новой музыки. Вся моя музыка хранится в двух папках /home/$USER/Dropbox/Music и /home/$USER/Dropbox/New Music.

Также полезно показать содержимое других папок Dropbox в стандартных папках Ubuntu («Документы», «Изображения» и т. Д.).

Я искал и пытался найти ответ самостоятельно, но безрезультатно. Я уверен, что есть способ сделать это; Я просто скучаю по этому.

Спасибо заранее.

10
задан 22 May 2017 в 20:52

2 ответа

Решение (решения) в виде сценария

1. Автоматически обновленное представление библиотеки

С фоновым сценарием ниже, можно настроить каталог, фактически показав объединенное содержание произвольного числа других папок.

Содержание папки (существующий из символьных ссылок) динамично синхронизируется с (объединенными) источниками.

Как это работает

Сценарий периодически перечисляет содержание исходных папок, а также целенаправленной папки для "библиотеки" - представление.

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

enter image description here

Сравнение списков является чрезвычайно легким весом (программно) и низко на ресурсах. Я протестировал сценарий с намного более быстрым циклом затем в сценарии ниже, со многими объектами приблизительно 500 на единственном уровне каталога, без дополнительной (noticable) загрузки вообще.

Сценарий и как использовать

#!/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. Если все хорошо работает, добавьте его для запущения приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:

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

Примечание:

Как упомянуто, можно добавить больше чем два каталога Соре, если Вам нравится.

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)

Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду эй сочетание клавиш по Вашему выбору:

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
8
ответ дан 23 May 2017 в 06:52
  • 1
    Превосходный, I' m довольный это работало / помог, если у Вас есть дальнейшие проблемы, не стесняйтесь отправлять, и я уверен, что кто-то поможет Вам. – marko 10 October 2017 в 21:21

Можно установить unionfs-fuse для этого:

sudo apt-get install unionfs-fuse 

Монтирование:

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

Это сгруппирует все содержание от folder1 и folder2 (или больше если Вы захотите) к Вашей точке монтирования

Umounting:

sudo umount /mount/point
3
ответ дан 23 May 2017 в 06:52
  • 1
    благодарит вынуть время для записи этого удивительного ответа, № 1 работал правильно далеко. Оказывается, что я переусердствовал меня и невольно сделал " смешанный mode" установка. – vedant gala 17 October 2017 в 00:04

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

Похожие вопросы: