ワイルドカードを使用したシンボリックリンクの作成

ワイルドカードを使用したシンボリックリンクの作成

同じディレクトリ階層を持つ複数のハードドライブがあります。たとえば、次のようになります。

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

名前とディレクトリ名が似ている2つのハードドライブ。各ハードドライブにdir1とdir2への別々のシンボリックリンクを作成したいと思います。私が見つけた最も簡単な方法は、次を使用することですcp -sR

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

ただし、これを実行すると/somedirに新しいディレクトリが作成され、ディレクトリタイムスタンプが役に立たなくなるなど、さまざまな副作用が発生します。

/media/sd*/dir1 および /media/sd*/dir2 への dir1 と 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

これにより、/media/sd*/dir1(または dir2) の下に存在するすべてのファイルを指す /somedir/dir1/(または dir2) にシンボリックリンクが生成されます。このスクリプトは、ソースディレクトリの下に存在できる階層を保持しません。

編集:すべてのリンクを1つのディレクトリに配置する場合は、少し変更されたバージョンは次のとおりです。

[[ ! -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

関連情報