使用通配符创建符号链接

使用通配符创建符号链接

我有多个具有相同目录层次结构的硬盘,例如:

/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

相关内容