Здесь много совершенно правильных ответов, но я не думаю, что кто-то действительно справился с первоначальным заблуждением. Исходный вопрос в основном заключается в том, что «когда я делаю символическую ссылку, впоследствии ее легко идентифицировать. Но я не могу понять, как определить жесткую ссылку». И да, ответы в основном сводятся к «вы не можете» и более или менее объясняют почему, но никто, кажется, не признал, что, действительно, это сбивает с толку и странно.
Если ты читаешь все это и понимаешь, что происходит, тогда ты в порядке; Вам не нужно читать мою маленькую часть. Если вы все еще в замешательстве, то продолжайте.
Действительно очень короткий ответ заключается в том, что жесткая ссылка на самом деле вовсе не ссылка, а не символическая ссылка. Это новая запись в структуре каталогов, которая указывает на тот же набор байтов, что и оригинальная запись каталога, и после того, как вы ее создали, она так же «реальна» и легитимна, как и первая. Каждый «нормальный» файл на вашем диске имеет хотя бы одну жесткую ссылку; без этого вы бы не увидели ни в одномкаталог, и не сможет ссылаться на него или использовать его. Поэтому, если у вас есть файл Fred.txt и вы жестко связываете с ним Wilma.txt и Barney.txt, все три имени (и записи каталога) ссылаются на один и тот же файл, и все они одинаково действительны. Для ОС нет никакого способа сказать, что одна из записей была создана, когда вы нажали «сохранить» в текстовом редакторе, а другие были сделаны с помощью команды «ln».
ОС действительно должны отслеживать , сколько различных записей , указывающих на тот же файл, хотя. Если вы удалите Wilma.txt, не удивительно, что вы не освободите место на диске. Но если вы удалите Fred.txt («оригинальный» файл), вы все равно не освободите место на диске, потому что данные на диске, который был известен как Fred.txt, по-прежнему также Barney.txt. Только когда вы удалите все записи каталога, ОС освободит место, которое занимали сами данные.
Если бы Barney.txt был символической ссылкой, то удаление Fred.txt освободило бы пространство, а Barney.txt теперь было бы неработающей ссылкой. Кроме того, если вы переместите или переименуете файл, на который указывает символическая ссылка, вы нарушите эту ссылку. Но вы можете перемещать или переименовывать жестко связанный файл, как вам угодно, не нарушая другие записи каталога, которые указывают на этот файл / данные, поскольку все они являются записями каталога, которые ссылаются на один и тот же блок данных на диске (с помощью индекс # этих данных).
[Прошло два года, и это последнее немного смутило меня , так что я думаю, что уточнить. Если вы наберете «mv ./Wilma.txt ../elsewhere/Betty.txt», то, похоже, вы перемещаете файл, но на самом деле это не так. Что вы действительно делаете, так это удаляете элемент строки из списка каталогов вашего текущего каталога, тот, который говорит, что «имя« Wilma.txt »связано с данными, которые можно найти с помощью inode ###### #, "и добавление новой позиции в список каталогов каталога ../elsewhere, где говорится, что" имя 'Betty.txt' связано с данными, которые можно найти через inode ####### ". Вот почему вы можете «переместить» файл размером 2 гигабайта так же быстро, как файл размером 2 килобайта, при условии, что вы перемещаете их в другое место на том же диске.]
Поскольку ОС должна отслеживать, сколько разных записей каталога указывают на один и тот же кусок данных, вы можете определить, была ли жесткая ссылка на конкретный файл, даже если вы не можете точно сказать, является ли эта запись каталога Вы смотрите на «оригинал» или нет. Одним из способов является команда «ls», а именно «ls -l» (это строчная буква L после тире)
Заимствовать более ранний пример ....
-rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f1
Первая буква - тире, так что это не каталог или что-то еще экзотическое, это обычный файл. Но если бы оно было действительно обычным, это число после части rwx-ish было бы «1», как, например, «есть одна запись каталога, указывающая на этот блок данных». Но это часть демонстрации жестких ссылок, поэтому вместо этого написано «3».
Обратите внимание, что это может привести к странному и таинственному поведению (то есть, если вы не обернулись вокруг жестких ссылок). Если вы откроете Fred.txt в текстовом редакторе и внесете некоторые изменения, увидите ли вы те же изменения в Wilma.txt и Barney.txt? Может быть. Вероятно. Если ваш текстовый редактор сохраняет изменения, открыв исходный файл и записав в него изменения, то да, все три имени будут по-прежнему указывать на один и тот же (недавно измененный) текст. Но если ваш текстовый редактор создает новый файл (Fred-new-temp.txt), записывает в него измененную версию, затем удаляет Fred.txt, а затем переименовывает Fred-new-temp.txt в Fred.txt, Вильма и Барни по-прежнему указывать на оригинальную версию, а не на новую измененную версию. Если вы не понимаете жестких ссылок, это может привести вас в бешенство. :) [Ладно, я лично не знаю ни одноготекстовые редакторы, которые будут выполнять функцию new-file / rename, но я знаю много других программ, которые делают именно это, так что будьте начеку.]
И последнее замечание: одна из вещей, которую проверяет fsck (проверка файловой системы), состоит в том, есть ли на вашем диске блоки данных, на которые почему-то больше не ссылаются какие-либо записи каталога. Иногда что-то идет не так, и единственная запись в каталоге, которая указывает на индекс, удаляется, но само пространство диска не помечается как «доступное». Таким образом, одна из задач fsck - сопоставить все выделенное пространство со всеми записями каталога, чтобы убедиться, что нет никаких файлов, на которые нет ссылок. Если он находит некоторые, он создает новые записи каталога и помещает их в «lost + found».