我有多个具有相同目录层次结构的硬盘,例如:
/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?文件定期添加到硬盘驱动器,因此我需要定期运行这些命令。
答案1
这将创建/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*
比符号链接更能满足您的目的。
答案2
您可能想要这样做:
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/ (或 dir2)中创建符号链接,指向 /media/sd*/dir1 (或 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