私はしばしばシンボリックリンクを使用しますが、元のファイルを移動した後にシンボリックリンクを追跡できませんでした。また、同じディレクトリにあるいくつかのファイルを追跡するためにシンボリックリンクを使用しましたが、再び追跡を失いました。
- どの変更を適用してもシンボリックリンクを追跡する方法(ツール/方法)はありますか?ハードリンクは唯一の方法ですか?
- ソースファイルとリンクを含むディレクトリを移動するときにリンクが機能するように相対的な方法でシンボリックリンクを作成する方法はありますか?
答え1
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
最初の質問の場合、ファイルの元の場所に何をしても、同じファイルを参照するリンクが本当に必要な場合は、ハードリンクがおそらくあなたが望むものでしょう。ハードリンクは、基本的に同じインデックスノードを参照する別の名前です。したがって、ハードリンクと「オリジナルファイル」の間に違いはありません。ただし、ファイルシステム間で接続する必要がある場合、通常ハードリンクは機能せず、通常はディレクトリへのハードリンクを作成できません。また、特定のファイル操作を実行するときにいくつかの違いを見つけることができます。特に、元のファイルを削除してもファイルは削除されません。ハードリンクはまだファイルを指してアクセスできます。
答え2
readlinkコマンドを使用して(今は壊れている)リンクが元のポイントであることを検索/検査し、ファイルの新しい名前/場所を指すように変更できます。あるいは、ファイル名を変更し、ファイルへのすべてのリンクを検索して修復するシェルスクリプトを介してファイル名を変更することもできます。どちらにしても次のようになります。
find . -type l | while read L
do
if readlink $L | grep -q "^$OLDNAME\$"
then
ln -sf $NEWNAME $L
fi
done
ただし、これを続けると、シンボリックリンクを使用する必要があるターゲットではない可能性があります。