Symlink

使用萬用字元創建符號連結

  • May 20, 2020

我有多個具有相同目錄層次結構的硬碟驅動器,例如:

/media/sda/dir1
/media/sda/dir2
...
/media/sdb/dir1
/media/sdb/dir2

兩個具有相似名稱和相似目錄名稱的硬碟。我想在每個硬碟上創建指向 dir1 和 dir2 的單獨符號連結。我發現最簡單的方法是使用cp -sR

cp -sR /media/sd*/dir1 /somedir/dir1
cp -sR /media/sd*/dir2 /somedir/dir2

但是,這會在 /somedir 中創建新目錄,這會產生各種副作用,例如,目錄時間戳是無用的。

如何創建名為 dir1 和 dir2 的符號連結,它們連結到 /media/sd*/dir1 和 /media/sd*/dir2?文件會定期添加到硬碟驅動器中,因此我需要定期執行這些命令。

您可能想要這樣做:

for dir in dir1 dir2
do
 [[ ! -d /somedir/$dir ]] && mkdir /somedir/$dir    
 find /media/sd*/$dir -type f -exec bash -c \
   '[[ ! -f /somedir/'$dir'/$(basename $1) ]] && ln -s $1 /somedir/'$dir'/' foo {} \;
done

這會在 /somedir/dir1/ (resp. dir2) 中創建指向 /media/sd*/dir1 (resp. dir2) 下的所有文件的符號連結。此腳本不保留源目錄下可能存在的層次結構。

編輯:如果您希望將所有連結放在一個目錄中,這裡有一個稍微修改過的版本:

[[ ! -d /somedir/data ]] && mkdir /somedir/data    
find /media/sd*/dir[12] -type f -exec bash -c \
   '[[ ! -f /somedir/data/$(basename $1) ]] && ln -s $1 /somedir/data/' foo {} \;
done

這將創建/somedir/dir1/*指向/media/sd*/dir1/*.

mkdir /somedir/dir1
ln -sf /media/sd*/dir1 /somedir/dir1

如果一個文件或目錄存在多個,/media/sd*/dir1/則連結將指向最後一個,例如,如果您有:

/media/sda1/dir1/Movies
/media/sda1/dir1/Pictures
/media/sdb1/dir1/Movies
/media/sdb1/dir1/Data

你會得到:

/somedir/dir1/Movies -> /media/sdb1/dir1/Movies
/somedir/dir1/Pictures -> /media/sda1/dir1/Pictures
/somedir/dir1/Data -> /media/sdb1/dir1/Data

不確定這是否是您想要的。

在我看來,unionfs安裝/media/sd*比符號連結更能滿足您的目的。

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