Bash
在現有目錄中創建符號連結樹
我把我所有的音樂都放在一個 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 位於同一文件系統上的空目錄。