Crear un tree de enlace simbólico en los directorys existentes

Llevo toda mi música en un disco USB de 1TB y tengo una regla de udev para enlazarla simbólicamente a $HOME/Music/ cuando la conecto a una de mis computadoras portátiles, que es lo que hace.

El problema que tengo es que esto funciona bien donde el directory no existe en la computadora portátil, pero no crea el tree requerido donde hay un directory preexistente del mismo nombre (Artist / Album / *. Flac) en el portatil.

El script que actualmente ejecuto es este:

 #!/usr/bin/env bash # repopulate music links when drive plugged in shopt -s nullglob export DISPLAY=:0 export XAUTHORITY=/home/jason/.Xauthority music=(/media/Apollo/Music/*) find /home/jason/Music -type l -exec rm {} \; for dirs in "${music[@]}"; do ln -s "$dirs" /home/jason/Music/ 2>/dev/null done status1=$? mpc update &>/dev/null status2=$? if [[ "$status1" -eq 0 && "$status2" -eq 0 ]]; then printf "%s\n" "Music directory updated" | dzen2 -p 3 fi 

¿Cómo puedo garantizar que cuando exista un directory tanto en la computadora portátil como en la unidad USB, pero los contenidos sean ligeramente diferentes, los files se vinculen de manera correcta? Por ejemplo:

Unidad USB :

  Música - Matthew Shipp - Compostura Patoral - Pista 1
                                             - Pista 2, etc ...
                        - Strata - Pista 1
                                             - Pista 2, etc ...
                        - Equilibrio - Pista 1
                                             - Pista 2, etc ... 

Laptop :

  Música - Matthew Shipp - Compostura Patoral - Pista 1
                                             - Pista 2, etc ... 

En este caso, no se crearán enlaces simbólicos a los álbumes Strata o Equilibrium, presumiblemente porque existe el directory padre (Matthew Shipp).

Preferiría no utilizar rsync para copyr los datos reales, ya que tengo un espacio limitado en las computadoras portátiles y con mpd capaz de seguir enlaces simbólicos, no necesito copyr los files.

¿Es posible ajustar mi script para propagar enlaces simbólicos en directorys preexistentes en la computadora portátil?

Como su objective principal es tener una vista combinada de su carpeta de música local y externa, creo que se podría usar una unión de assembly a través de overlayfs , especialmente si los files no se están escribiendo.

El command básico es, en versiones anteriores del kernel (<3.18):

 mount -t overlayfs -o lowerdir=/read/only/directory,upperdir=/writeable/directory overlayfs /mount/point 

Por ejemplo:

 $ ls Documents 374620-63301.pdf My Kindle Content scan0005.jpg BPMN2_0_Poster_EN.pdf scan0003.jpg StrongDC++ $ ls devel cse ossec ubuntu-14.04-desktop-amd64-ssh.iso nexus scripts zsh-syntax-highlighting $ sudo mount -t overlayfs -o lowerdir=$PWD/Documents,upperdir=$PWD/devel overlayfs ~/Documents $ ls Documents 374620-63301.pdf scan0003.jpg BPMN2_0_Poster_EN.pdf scan0005.jpg cse scripts My Kindle Content StrongDC++ nexus ubuntu-14.04-desktop-amd64-ssh.iso ossec zsh-syntax-highlighting 

Un inconveniente es la necesidad de sudo , que tal vez se pueda NOPASSWD con una regla NOPASSWD cuidadosa.


A la luz de la publicación del blog de Jason , el command de assembly para kernels más nuevos cambia a usar overlay como el sistema de files, en lugar de overlayfs , y usando un workdir adicional. La documentation del kernel ahora codifica esto:

En time de assembly, los dos directorys proporcionados como opciones de assembly "lowerdir" y "upperdir" se combinan en un directory fusionado:

 mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,\ workdir=/work /merged 

El "workdir" debe ser un directory vacío en el mismo sistema de files que upperdir.

También puede usar gnu stow , un administrador de granja de enlace simbólico.

Asume el siguiente layout:

 . ├── drive │  ├── a │  │  ├── b │  │  │  └── bar │  │  └── c │  │  └── baz │  └── b └── music └── a └── b └── foo 

Ejecute: $ stow --target music --dir drive .

Resultado:

 . ├── drive │  ├── a │  │  ├── b │  │  │  └── bar │  │  └── c │  │  └── baz │  └── b └── music ├── a │  ├── b │  │  ├── bar -> ../../../drive/a/b/bar │  │  └── foo │  └── c -> ../../drive/a/c └── b -> ../drive/b