¿Hacer de la carpeta un enlace simbólico a dos carpetas?

10

Me gustaría tener la carpeta de música predeterminada de Ubuntu /home/$USER/Musicpara actuar como una biblioteca en Windows. Esencialmente sería una carpeta virtual que contiene el contenido de otras carpetas.

Mi razonamiento es que Rhythm Box solo verá una carpeta para escuchar música nueva. Toda mi música reside en dos carpetas /home/$USER/Dropbox/Musicy /home/$USER/Dropbox/New Music.

Esto también resulta útil para mostrar el contenido de otras carpetas de Dropbox en las carpetas predeterminadas de Ubuntu (Documentos, Imágenes, etc.).

Hice una búsqueda e intenté encontrar la respuesta por mi cuenta en vano. Estoy seguro de que hay una manera de lograr esto; Solo me lo estoy perdiendo.

Gracias por adelantado.

DanTheManDRH
fuente
1
Existe la posibilidad de unir 2 carpetas con: sudo mount --bind olddir newdirpero esto probablemente no sea exactamente lo que
busca
@ andrew.46 mount --bindpermite el acceso a un conjunto de carpeta desde dos puntos diferentes de montaje. OP quiere acceder a dos conjuntos de carpetas desde un punto de montaje
EdiD
@Edid: Vaya, por supuesto que tienes toda la razón ... perdón por el ruido ...
andrew.46
Podría pensar en una forma, pero requeriría un pequeño script de fondo. ¿Sería eso aceptable?
Jacob Vlijm
Por favor, no @JacobVlijm me diga el guión comprobará si hay archivos disponibles en el directorio y copiar a dos destinos .. después
heemayl

Respuestas:

8

Soluciones con guión

1. Vista de biblioteca actualizada automáticamente

Con el script de fondo a continuación, puede configurar un directorio, que muestra virtualmente el contenido combinado de un número arbitrario de otras carpetas.

El contenido de la carpeta (existente de enlaces simbólicos) se sincroniza dinámicamente con las fuentes (combinadas).

Cómo funciona

El script enumera periódicamente el contenido de las carpetas de origen, así como la carpeta de destino para la vista "biblioteca".

  • Si hay elementos en cualquiera de las carpetas de origen, que no existen en la biblioteca, se creará un enlace simbólico en la biblioteca.
  • Si hay elementos en la biblioteca, que no existen en ninguna de las carpetas de origen (en realidad, un enlace roto), el elemento se elimina de la biblioteca.

ingrese la descripción de la imagen aquí

Comparar listas es extremadamente ligero (programáticamente) y bajo en recursos. Probé la secuencia de comandos con un bucle mucho más rápido que en la secuencia de comandos a continuación, con una serie de elementos de aproximadamente 500 en un solo nivel de directorio, sin carga adicional (notable) en absoluto.

El guión y cómo 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 el script en un archivo vacío, guárdelo como library_view.py
  2. Pruebe a ejecutar el script con el directorio de destino , para ver los directorios combinados en, como primer argumento , los directorios de origen como los siguientes argumentos, por ejemplo:

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

    Este comando mostrará el contenido de las carpetas source1y source2en virtual_library.

  3. Si todo funciona bien, agréguelo a las aplicaciones de inicio: Tablero> Aplicaciones de inicio> Agregar. Agrega el comando:

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

Nota

Como se mencionó, puede agregar más de dos directorios de soure si lo desea.

2. Versión manual

Si prefiere no utilizar una secuencia de comandos de fondo por algún motivo, puede actualizar manualmente (sincronizar) la carpeta de la biblioteca, con exactamente el mismo comando bajo una tecla de acceso directo, utilizando la secuencia de comandos a continuación:

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

Elija: Configuración del sistema> "Teclado"> "Atajos"> "Atajos personalizados". Haga clic en "+" y agregue el comando a la combinación de teclas que elija:

python3 /path/to/library_view.py /path/to/virtual_library /path/to/source1 /path/to/source2
Jacob Vlijm
fuente
Jacob, realmente tengo que agradecerte por salir y escribir un guión para mí. Ahora tengo que usarlo, tú hiciste el trabajo. :-). Voy a intentar esto el fin de semana. Muchas gracias.
DanTheManDRH
1
@DanHutter Gracias! Espero que te guste. Si hay algo, hágamelo saber.
Jacob Vlijm
Hola Jacob, acabo de actualizar a Ubuntu Gnome 16.10, este script todavía funciona perfectamente. Actualmente lo uso para música, fotos y documentos. Gracias de nuevo.
DanTheManDRH
@DanHutter ¡Gracias por mencionar que es tan bueno escucharlo!
Jacob Vlijm
3

Puede instalar unionfs-fusepara esto:

sudo apt-get install unionfs-fuse 

Montaje:

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

Agrupará todo el contenido de la carpeta1 y la carpeta2 (o más si lo desea) a su punto de montaje

Desmontaje:

sudo umount /mount/point
EdiD
fuente