Tornar a pasta um link simbólico para duas pastas?

10

Eu gostaria que a pasta de músicas padrão do Ubuntu /home/$USER/Musicfuncionasse da mesma maneira que uma biblioteca faria no Windows. Essencialmente, seria uma pasta virtual contendo o conteúdo de outras pastas.

Minha lógica é que o Rhythm Box assistirá apenas uma pasta para novas músicas. Toda a minha música reside em duas pastas /home/$USER/Dropbox/Musice /home/$USER/Dropbox/New Music.

Isso também é útil para mostrar o conteúdo de outras pastas do Dropbox nas pastas padrão do Ubuntu (Documentos, Imagens, etc).

Eu pesquisei e tentei encontrar a resposta sozinho, sem sucesso. Tenho certeza de que há uma maneira de fazer isso; Eu só estou sentindo falta disso.

Desde já, obrigado.

DanTheManDRH
fonte
11
Existe a capacidade de vincular duas pastas: sudo mount --bind olddir newdirmas provavelmente não é exatamente isso que você
procura
@ andrew.46 mount --bindpermite acesso a um conjunto de pastas a partir de dois pontos de montagem diferentes. OP quer acesso dois conjuntos de pastas de um ponto de montagem
edid
@Edid: Oops, você são, naturalmente, perfeitamente correta ... desculpe pelo barulho ...
andrew.46
Eu poderia pensar em uma maneira, mas isso exigiria um pequeno script em segundo plano. Isso seria aceitável?
Jacob Vlijm
@JacobVlijm Por favor, não me diga que o script irá verificar se algum arquivo está disponível no diretório e copiar para dois destinos depois ..
heemayl

Respostas:

8

Solução (s) com script

1. Visualização da biblioteca atualizada automaticamente

Com o script em segundo plano abaixo, você pode configurar um diretório, mostrando virtualmente o conteúdo combinado de um número arbitrário de outras pastas.

O conteúdo da pasta (existente de links simbólicos) é sincronizado dinamicamente com as fontes (combinadas).

Como funciona

O script lista periodicamente o conteúdo das pastas de origem e a pasta de destino da visualização "biblioteca".

  • Se houver itens em qualquer uma das pastas de origem, não existentes na biblioteca, um link simbólico será criado na biblioteca.
  • se houver itens na biblioteca, não existentes em nenhuma das pastas de origem (na verdade, um link quebrado), o item será removido da biblioteca.

insira a descrição da imagem aqui

A comparação de listas é extremamente leve (programaticamente) e com poucos recursos. Testei o script com um loop muito mais rápido do que o script abaixo, com vários itens de cerca de 500 em um único nível de diretório, sem carga (perceptível) adicional.

O script e como usar

#!/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. Copie o script em um arquivo vazio, salve-o como library_view.py
  2. Teste - execute o script com o diretório de destino , para visualizar os diretórios combinados, como primeiro argumento , nos diretórios de origem como próximos argumentos, por exemplo:

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

    Este comando mostrará o conteúdo das pastas source1e source2dentro virtual_library.

  3. Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash> Startup Applications> Add. Adicione o comando:

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

Nota

Como mencionado, você pode adicionar mais de dois diretórios de soure, se quiser.

2. Versão manual

Se você preferir não usar um script em segundo plano por algum motivo, poderá atualizar (sincronizar) manualmente a pasta da biblioteca, exatamente com o mesmo comando em uma tecla de atalho, usando o script abaixo:

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

Escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione o comando com uma combinação de teclas de sua escolha:

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
Jacob Vlijm
fonte
Jacob, eu realmente tenho que agradecer por você ter escrito tudo e escrito um roteiro para mim. Agora eu tenho que usá-lo, você fez o trabalho. :-). Vou dar uma chance no final de semana. Muito Obrigado.
DanTheManDRH
11
@DanHutter Thanks! Espero que você goste. Se houver algo, por favor me avise.
Jacob Vlijm
Oi Jacob, Acabei de atualizar para o Ubuntu Gnome 16.10 esse script ainda funciona perfeitamente. Atualmente usando-o para músicas, fotos e documentos! Mais uma vez obrigado.
DanTheManDRH
@ DanHutter Obrigado por mencionar, que é tão bom ouvir isso!
23416 Jacob Vlijm
3

Você pode instalar unionfs-fusepara isso:

sudo apt-get install unionfs-fuse 

Montagem:

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

Vai grupo todo o conteúdo do folder1 e Folder2 (ou mais se quiser) para o seu ponto de montagem

Umounting:

sudo umount /mount/point
EdiD
fonte