Bash

在現有目錄中創建符號連結樹

  • September 10, 2021

我把我所有的音樂都放在一個 1TB 的 USB 驅動器上,當我將它插入我的一台筆記型電腦時,我有一個 udev 規則來符號連結它$HOME/Music/,它確實如此。

我遇到的問題是,在筆記型電腦上不存在該目錄的情況下,這可以正常工作,但它不會創建必要的樹,其中存在同名的預先存在的目錄(藝術家/專輯/* .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 -- Patoral Composure -- Track 1
-- 軌道 2 等...
-- 地層 -- 軌道 1
-- 軌道 2 等...
-- 平衡 -- 軌道 1
-- 軌道 2 等...

筆記型電腦

音樂 -- Matthew Shipp -- Patoral Composure -- Track 1
-- 軌道 2 等...

在這種情況下,不會創建指向專輯 Strata 或 Equilibrium 的符號連結,可能是因為父目錄 (Matthew Shipp) 存在。

我不希望使用rsync複制實際數據,因為我在筆記型電腦上的空間有限並且mpd能夠遵循符號連結,我不需要復製文件。

是否可以調整我的腳本以將符號連結傳播到筆記型電腦上預先存在的目錄中?

由於您的主要目標是獲得本地和外部音樂文件夾的組合視圖,因此我認為可以使用聯合掛載方式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規則來處理。


根據Jason 的部落格文章,較新核心的 mount 命令更改為使用overlay文件系統,而overlayfs不是workdir. 核心文件現在對此進行了編碼:

在掛載時,作為掛載選項“lowerdir”和“upperdir”給出的兩個目錄合併為一個合併目錄:

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

“workdir”必須是與upperdir 位於同一文件系統上的空目錄。

引用自:https://unix.stackexchange.com/questions/179397