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

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

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

Это также полезно показать содержимое других папок Dropbox в папках по умолчанию Ubuntu (Documents, Pictures и т. Д.).

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

Заранее спасибо.

Сценарий решения (ов)

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

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

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

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

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

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

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

Сравнение списков – очень легкий (программный) и низкий уровень ресурсов. Я протестировал скрипт с гораздо более быстрым циклом, а затем в приведенном ниже скрипте с количеством элементов около 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 

Заметка

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

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 

Для этого вы можете установить unionfs-fuse :

 sudo apt-get install unionfs-fuse 

Монтаж:

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

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

Umounting:

 sudo umount /mount/point