私はシンボリックリンクを頻繁に使用しますが、元のファイルを移動した後、シンボリックリンクを見失います。また、同じディレクトリ内のいくつかのファイルを追跡するためにシンボリックリンクを使用していますが、繰り返しになりますが、追跡できなくなります。
2番目の質問に関しては、相対パスを使用してシンボリックリンクを作成してから、ディレクトリ構造全体を移動しても、引き続き機能するはずです。次のターミナルセッションについて考えてみます。
~$ mkdir test
~$ cd test/
~/test$ mkdir test2
~/test$ cd test2/
~/test/test2$ touch testfile; echo "hello, world" > testfile
~/test/test2$ cat testfile
hello, world
~/test/test2$ cd ..
~/test$ ln -s ./test2/testfile testfileln
~/test$ ls -l
total 8
drwxr-xr-x 2 xxxx xxxx 4096 2010-09-09 09:18 test2
lrwxrwxrwx 1 xxxx xxxx 16 2010-09-09 09:18 testfileln -> ./test2/testfile
~/test$ cd ..
~$ mv test/ testfoo
~$ cd testfoo/
~/testfoo$ ls -l
total 8
drwxr-xr-x 2 xxxx xxxx 4096 2010-09-09 09:18 test2
lrwxrwxrwx 1 xxxx xxxx 16 2010-09-09 09:18 testfileln -> ./test2/testfile
/testfoo$ cat testfileln
hello, world
最初の質問に関しては、ファイルの元の場所で何をしても同じファイルを参照するリンクが本当に必要な場合は、ハードリンクがおそらく必要です。ハードリンクは基本的に、同じiノードを参照する単なる別の名前です。したがって、ハードリンクと「元のファイル」の間に違いはありません。ただし、ファイルシステム間でリンクする必要がある場合、ハードリンクは機能しないことが多く、通常はディレクトリへのハードリンクを作成できません。さらに、いくつかのファイル操作を実行すると、いくつかの違いに気付くでしょう。特に、オリジナルを削除してもファイルは削除されません。ハードリンクは引き続きファイルを指し、アクセス可能です。
Readlinkコマンドを使用して、(現在壊れている)リンクが最初に指していたものを検出/確認し、ファイルの新しい名前/場所が何であれ、それを指すように修正できます。または、ファイルの名前を変更し、そのファイルを指すリンクを検索して修正するシェルスクリプトを使用してのみ、ファイルの名前を変更することもできます。いずれにせよ、あなたはこのようなものになるでしょう:
find . -type l | while read L
do
if readlink $L | grep -q "^$OLDNAME\$"
then
ln -sf $NEWNAME $L
fi
done
ただし、これを常に実行している場合、シンボリックリンクはおそらく使用すべきものではありません。