web-dev-qa-db-ja.com

シンボリックリンクを追跡し続けますか?

私はシンボリックリンクを頻繁に使用しますが、元のファイルを移動した後、シンボリックリンクを見失います。また、同じディレクトリ内のいくつかのファイルを追跡するためにシンボリックリンクを使用していますが、繰り返しになりますが、追跡できなくなります。

  • どんな変更を加えても、シンボリックリンクを追跡する方法(ツール/方法)はありますか?これを行うには、ハードリンクが唯一の方法ですか?
  • 元のリンクとリンクの両方を含むディレクトリを移動したときにリンクが機能するように、シンボリックリンクを相対的な方法で作成する方法はありますか?.
4
prosseek

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ノードを参照する単なる別の名前です。したがって、ハードリンクと「元のファイル」の間に違いはありません。ただし、ファイルシステム間でリンクする必要がある場合、ハードリンクは機能しないことが多く、通常はディレクトリへのハードリンクを作成できません。さらに、いくつかのファイル操作を実行すると、いくつかの違いに気付くでしょう。特に、オリジナルを削除してもファイルは削除されません。ハードリンクは引き続きファイルを指し、アクセス可能です。

7
Steven D

Readlinkコマンドを使用して、(現在壊れている)リンクが最初に指していたものを検出/確認し、ファイルの新しい名前/場所が何であれ、それを指すように修正できます。または、ファイルの名前を変更し、そのファイルを指すリンクを検索して修正するシェルスクリプトを使用してのみ、ファイルの名前を変更することもできます。いずれにせよ、あなたはこのようなものになるでしょう:

find . -type l | while read L
do
    if readlink $L | grep -q "^$OLDNAME\$"
    then
        ln -sf $NEWNAME $L
    fi
done

ただし、これを常に実行している場合、シンボリックリンクはおそらく使用すべきものではありません。

2
Neil Mayhew