Продолжайте отслеживать символические ссылки?

Я использую символические ссылки довольно часто, но после перемещения исходного файла я теряю ссылку на символическую ссылку. Я также использую символические ссылки для отслеживания некоторых файлов в одном каталоге, но опять же, я теряю трек.

  • Есть ли способ (инструмент / метод) отслеживать символическую ссылку независимо от того, какое изменение я делаю? Является ли жесткая ссылка единственным способом для этого?
  • Есть ли способ сделать символическую ссылку относительно, чтобы при перемещении каталога, содержащего как оригинал, так и ссылку, ссылка должна работать.

Конкурируя второй вопрос, если вы создаете символическую ссылку с использованием относительного пути, а затем перемещаете всю структуру каталогов, она все равно должна работать. Рассмотрим следующий сеанс терминала:

~$ 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 

Что касается вашего первого вопроса, если вам действительно нужна ссылка, которая будет ссылаться на тот же файл, независимо от того, что вы делаете с исходным расположением файла, жесткая ссылка, вероятно, то, что вы хотите. Жесткая ссылка – это просто другое имя, относящееся к тому же inode. Таким образом, нет никакой разницы между жесткой ссылкой и «исходным файлом». Однако, если вам нужно связать файловые системы, жесткие ссылки часто не работают, и вы обычно не можете создавать жесткие ссылки на каталоги. Кроме того, вы заметите некоторые отличия при выполнении некоторых файловых операций. Прежде всего, удаление оригинала не приведет к удалению файла. Жесткая ссылка будет по-прежнему указывать на файл и быть доступной.

Вы можете использовать команду readlink для обнаружения / проверки того, на какую изначально была указана ссылка (теперь неработающая), и затем исправить ее, чтобы указать на то, что имя / местоположение файла есть. Или вы можете переименовать файл только через сценарий оболочки, который переименовывает файл и ищет и исправляет любые ссылки, которые указывают на него. В любом случае, вы бы так подумали:

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

Однако, если вы делаете это все время, символические ссылки, вероятно, не то, что вы должны использовать.