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

10

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

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

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

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

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

DanTheManDRH
источник
1
Существует возможность связать 2 папки вместе с: sudo mount --bind olddir newdirно это, вероятно, не совсем то, что вы ищете ...
andrew.46
@ andrew.46 mount --bindпозволяет получить доступ к одному набору папок из двух разных точек монтирования. ОП хочет получить доступ к двум наборам папок из одной точки монтирования
EdiD
@ Edid: Упс, вы, конечно, совершенно правы ... извините за шум ...
Андрей.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

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

Umounting:

sudo umount /mount/point
EDID
источник