Faire du dossier un lien symbolique vers deux dossiers?

10

J'aimerais que le dossier de musique par défaut d'Ubuntu /home/$USER/Musicagisse à peu près comme une bibliothèque dans Windows. Il s'agirait essentiellement d'un dossier virtuel contenant le contenu d'autres dossiers.

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

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

J'ai cherché et essayé de trouver la réponse par moi-même en vain. Je suis sûr qu'il existe un moyen d'y parvenir; Il me manque juste.

Merci d'avance.

DanTheManDRH
la source
1
Il y a la possibilité de lier 2 dossiers avec: sudo mount --bind olddir newdirmais ce n'est probablement pas exactement ce que vous recherchez ...
andrew.46
@ andrew.46 mount --bindpermet d'accéder à un ensemble de dossiers à partir de deux points de montage différents. OP souhaite accéder à deux ensembles de dossiers à partir d'un point de montage
EdiD
@Edid: Oups, vous avez bien sûr parfaitement raison ... désolé pour le bruit ...
andrew.46
Je pourrais penser à un moyen, mais cela nécessiterait un petit script de fond. Serait-ce acceptable?
Jacob Vlijm
@JacobVlijm S'il vous plaît, ne me dites pas que le script vérifiera si un fichier est disponible dans le répertoire et copiera ensuite vers deux destinations ..
heemayl

Réponses:

8

Solution (s) scriptée (s)

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

Avec le script d'arrière-plan ci-dessous, vous pouvez configurer un répertoire, montrant 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 y a des éléments dans l'un des dossiers source, qui n'existent pas dans la bibliothèque, un lien symbolique sera créé dans la bibliothèque.
  • s'il y a des éléments dans la bibliothèque, non existant dans l' un des dossiers de source ( en fait un lien cassé), l'élément est retiré de la bibliothèque.

entrez la description de l'image ici

La comparaison des listes est extrêmement légère (par programme) et faible en ressources. J'ai testé le script avec une boucle beaucoup plus rapide que dans le script ci-dessous, avec un certain nombre d'éléments d'environ 500 dans un seul niveau de répertoire, sans aucune charge supplémentaire (notable) que ce soit.

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 library_view.py
  2. Testez-exécutez le script avec le répertoire cible , pour afficher les répertoires combinés dans, comme premier argument , les répertoires source comme arguments suivants, par exemple:

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

    Cette commande affichera le contenu des dossiers source1et source2dans virtual_library.

  3. Si tout fonctionne bien, ajoutez-le aux applications de démarrage: Dash> Startup Applications> Add. 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 un script d'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, en utilisant le 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 yo une combinaison de touches de votre choix:

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
Jacob Vlijm
la source
Jacob, je dois vraiment vous remercier d'avoir tout fait et d'avoir écrit un script pour moi. Maintenant, je dois l'utiliser, vous avez fait le travail. :-). Je vais essayer ça ce week-end. Merci beaucoup.
DanTheManDRH
1
@DanHutter Merci! J'espère que vous l'aimerez. S'il y a quelque chose, faites-le moi savoir.
Jacob Vlijm
Salut Jacob, je viens de passer à Ubuntu Gnome 16.10 ce script fonctionne toujours parfaitement. L'utilise actuellement pour la musique, les photos et les documents! Merci encore.
DanTheManDRH
@DanHutter Merci d'avoir mentionné, c'est tellement bon à entendre!
Jacob Vlijm
3

Vous pouvez installer unionfs-fusepour cela:

sudo apt-get install unionfs-fuse 

Montage:

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

Il regroupera tout le contenu du dossier1 et du dossier2 (ou plus si vous le souhaitez) à votre point de montage

Montage:

sudo umount /mount/point
EdiD
la source