web-dev-qa-db-ja.com

ワイルドカードを使用してシンボリックリンクを作成する

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

/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という名前のシンボリックリンクを作成するにはどうすればよいですか?ファイルはハードドライブに定期的に追加されるため、これらのコマンドを定期的に実行する必要があります。

7
Haukur

あなたはそれをしたいかもしれません:

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)の下にあるすべてのファイルを指します。このスクリプトは、ソースディレクトリの下に存在する可能性のある階層を保持しません。

編集:すべてのリンクを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
2
jlliagre

これにより、/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/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*へのマウントは、シンボリックリンクよりも目的に適しているように思えます。

6
janos