在现有目录中创建符号链接树

在现有目录中创建符号链接树

我将所有音乐都放在一个 1TB USB 驱动器上,$HOME/Music/当我将其插入我的一台笔记本电脑时,它会通过 udev 规则进行符号链接,确实如此。

我遇到的问题是,这在目录所在的地方工作得很好不是存在于笔记本电脑上,但它不会创建必要的树,其中笔记本电脑上有一个预先存在的同名目录 (Artist/Album/*.flac)。

我当前运行的脚本是这样的:

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

如何确保笔记本电脑和 USB 驱动器上都存在目录,但内容略有不同,文件符号链接正确?例如:

USB驱动器:

音乐 -- Matthew Shipp -- 田园诗般的平静 -- Track 1
                                            -- 轨道 2 等...
                       -- 地层 -- 轨道 1
                                            -- 轨道 2 等...
                       -- 平衡 -- 第 1 轨
                                            -- 轨道 2 等...

笔记本电脑:

音乐 -- Matthew Shipp -- 田园诗般的平静 -- Track 1
                                            -- 轨道 2 等...

在这种情况下,不会创建指向专辑 Strata 或 Equilibrium 的符号链接,大概是因为父目录 (Matthew Shipp) 存在。

我不想用来rsync复制实际数据,因为我的笔记本电脑空间有限,并且能够mpd跟踪符号链接,我不需要复制文件。

是否可以调整我的脚本以将符号链接传播到笔记本电脑上预先存在的目录中?

答案1

由于您的主要目标是获得本地和外部音乐文件夹的组合视图,我认为联合安装通过overlayfs可以使用,特别是在未写入文件的情况下。

在较旧的内核版本(<3.18)中,基本命令是:

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

例如:

$ 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

一个缺点是需要sudo,这也许可以使用仔细的规则来解决NOPASSWD


鉴于杰森的博客文章,较新内核的 mount 命令更改为用作overlay文件系统,而不是overlayfs,并使用附加的workdir.内核文档现在将其编纂为:

在挂载时,作为挂载选项“lowerdir”和“upperdir”给出的两个目录将组合成一个合并目录:

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

“workdir”必须是与 upperdir 位于同一文件系统上的空目录。

答案2

您还可以使用牛羚斯托,符号链接农场经理。

假设以下布局:

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

执行:$ stow --target music --dir drive .

结果:

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

答案3

另一种选择是使用 Xorg 的lndir

lndir source target

注意来源需要是相对于目标。如果您位于带有musicand的目录中drive,则意味着:

lndir ../drive music

因为如果你在 则drive位于。../drivemusic

相关内容