web-dev-qa-db-fra.com

Faire un dossier un lien symbolique à deux dossiers?

J'aimerais que le dossier de musique par défaut d'Ubuntu, /home/$USER/Music, fonctionne comme une bibliothèque sous Windows. Ce serait essentiellement un dossier virtuel contenant le contenu d'autres dossiers.

Mon raisonnement est que Rhythm Box ne regardera qu'un dossier pour la nouvelle musique. Toute ma musique réside dans deux dossiers /home/$USER/Dropbox/Music et /home/$USER/Dropbox/New Music.

Cela s'avère également utile pour afficher le contenu d'autres dossiers Dropbox dans les dossiers par défaut d'Ubuntu (Documents, Images, etc.).

J'ai fait des recherches et j'ai essayé de trouver la réponse moi-même sans succès. Je suis sûr qu'il existe un moyen d'accomplir cela. Il me manque juste.

Merci d'avance.

9
DanTheManDRH

Solution scriptée

1. Vue de la bibliothèque mise à jour automatiquement

Avec le script d'arrière-plan ci-dessous, vous pouvez configurer un répertoire, affichant virtuellement le contenu combiné d'un nombre arbitraire d'autres dossiers.

Le contenu du dossier (existant des liens symboliques) est synchronisé dynamiquement avec les sources (combinées).

Comment ça fonctionne

Le script répertorie périodiquement le contenu des dossiers source ainsi que le dossier ciblé pour la vue "bibliothèque".

  • S'il existe des éléments dans l'un des dossiers source, n'existant pas dans la bibliothèque, un lien symbolique sera créé dans la bibliothèque.
  • s'il existe des éléments dans la bibliothèque, n'existant pas dans l'un des dossiers source (en fait, un lien rompu), l'élément est supprimé de la bibliothèque.

enter image description here

Comparer des listes est extrêmement léger (par programme) et peu de ressources. J'ai testé le script avec une boucle beaucoup plus rapide que dans le script ci-dessous, avec un nombre d'éléments d'environ 500 dans un seul niveau de répertoire, sans charge supplémentaire (notable).

Le script et comment utiliser

#!/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. Copiez le script dans un fichier vide, enregistrez-le sous le nom library_view.py
  2. Test - lancez le script avec le répertoire ciblé , pour afficher les répertoires combinés dans, comme premier argument , les répertoires sources comme arguments suivants, par exemple:

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

    Cette commande affiche le contenu des dossiers source1 et source2 dans virtual_library.

  3. Si tout fonctionne correctement, ajoutez-le aux applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

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

Remarque

Comme mentionné, vous pouvez ajouter plus de deux répertoires Soure si vous le souhaitez.

2. Version manuelle

Si vous préférez ne pas utiliser de script en arrière-plan pour une raison quelconque, vous pouvez mettre à jour (synchroniser) manuellement le dossier de la bibliothèque, avec exactement la même commande sous une touche de raccourci, à l'aide du script ci-dessous:

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

Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande à une combinaison de touches de votre choix:

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
8
Jacob Vlijm

Vous pouvez installer unionfs-Fuse pour cela:

Sudo apt-get install unionfs-Fuse 

Montage:

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

Il regroupera tout le contenu de folder1 et folder2 (ou plus si vous le souhaitez) à votre point de montage.

mounting:

Sudo umount /mount/point
3
EdiD