Используя команду link, чтобы увидеть, как это работает

link file1.txt file2.txt

file1.txt содержит ham а также file2.txt содержит cheese,

я добавил 123 в file1.txt, Сейчас file1.txt имеет ham123, Если мое понимание верно, любые изменения, внесенные в один файл, повлияют на другой, но file2.txt не изменился. Почему бы и нет?

Вот мое издание с полным и точным выводом моих команд:

$ ls -li
total 16
1363827 -rw-r--r--@ 1 kim  staff  13 Jan 20 20:09 file1.txt
1363844 -rw-r--r--@ 1 kim  staff  22 Jan 20 20:09 file2.txt
$ cat file1.txt
one
two
$ cat file2.txt
one1
two2
$ link file1.txt file2.txt
link: file2.txt: File exists
$ ls -li
total 16
1363827 -rw-r--r--@ 1 kim  staff  13 Jan 20 20:09 file1.txt
1363860 -rw-r--r--@ 1 kim  staff  10 Jan 20 20:11 file2.txt
$ cat file1.txt
$ cat file2.txt
one1
two2

Как видите, я удалил все внутри file1.txt. Однако file2.txt не был изменен. Оба файла находятся в одном каталоге. Я использовал свой текстовый редактор для их создания.

2 ответа

TL;DR: создание жесткой ссылки не создает отношения между различными файлами, что приводит к тому, что новые изменения в одном отражаются в другом. Вместо этого он создает другое имя для того же файла. Ваш link Команда не выполнена, потому что вы сказали создать ссылку file2.txt, но file2.txt уже существовал.

Как и люди и вещи в мире, файл может иметь более одного имени.

Часто полезно иметь какой-то способ ссылаться на что-то. Для некоторых вещей полезно иметь более одного способа. Это не ограничивается вычислениями.

Например, "ацетаминофен" и "парацетамол" относятся к одному и тому же лекарству. Правильно говорить, что ацетаминофен является парацетамолом, и одинаково правильно говорить, что парацетамол является ацетаминофеном. Ни одно из имен не относится к другому - вместо этого они относятся к определенному химическому веществу, которое отличается от любого из его названий.

Так же, как слово или фраза могут идентифицировать человека или вещь на естественном языке, ссылка - также называемая жесткой ссылкой - идентифицирует файл, а некоторые файлы имеют несколько ссылок. Это не ссылки друг на друга, а на файл. (Чтобы быть точным, то, что они идентифицируют, является индексом файла. См. Ниже.)

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

Когда ты побежал link, это не удалось, и ссылка не была создана.

когда link я же говорил link: file2.txt: File exists, это было на самом деле сообщение об ошибке. Потому что файл file2.txt уже существовало, link Команде не удалось создать ссылку с этим именем. таким образом file1.txt а также file2.txt все еще являются отдельными файлами, и именно так они могут иметь различное содержимое.

link Команда не создает отношения между отдельными файлами. Создает другое имя для того же файла. Это имя может быть другим, или находиться в другом каталоге, или в обоих, но оно имеет то же отношение к файлу, что и его оригинальное имя. Обычное, хотя и несколько неточное сокращение, вы, возможно, слышали об этом, что "жесткая ссылка - это файл".

Ссылки и иноды

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

  • Содержимое файла может быть физически распределено по всему диску.
  • Метаданные о том, где найти содержимое файла, а также владелец, владелец группы, разрешения и любые расширенные атрибуты файла, хранятся в структуре данных, называемой индексом. (Индод также содержит некоторую другую информацию.)
  • Для каждого отдельного файла существует ровно один индекс, и каждый индекс идентифицируется номером. Этот номер inode - это номер, показанный в левом столбце при запуске ls -li (а не совсем, когда вы просто бежите ls -l). Два разных файла, находящихся на одном устройстве, всегда имеют разные номера инодов.
  • Полезно иметь возможность рассматривать файл как имеющий имя и находящийся где-то в иерархии каталогов. Следовательно, файл может иметь одну или несколько ссылок (также называемых жесткими ссылками, поскольку существует нечто, называемое "мягкой" или "символической" ссылкой). Каждая ссылка имеет ровно одно имя и местоположение. Ссылки файла - это ссылки на индекс.
  • Индекс файла содержит количество ссылок на него, существующих в данный момент. Когда создается новая ссылка, этот счетчик увеличивается; когда ссылка удалена, она уменьшается. Когда он уменьшается до нуля, то есть когда удаляется последняя ссылка, файл удаляется.
  • ln (без -s), cp -l, а также link Команды создают дополнительную ссылку на существующий файл. Например, link file1.txt file2.txt требует, чтобы ссылка file1.txt уже существует и что нет ссылки file2.txt существует, и это создает новую ссылку file2.txt в тот же файл, который file2.txt ссылки на. В большинстве случаев достаточно сказать, что file2.txt это ссылка на file1.txt "Это одинаково правильно сказать" file1.txt это ссылка на file2.txt Msgstr "Внутренне ни один не указывает на другой, но вместо этого оба указывают на один и тот же индекс.
  • rm а также unlink Команды удалить ссылки. Когда мы бежим rm foo мы склонны думать об этом как об удалении foo, но никакие данные в файле не теряются, и дисковое пространство, соответствующее файлу, не освобождается, пока не будут удалены все ссылки на файл. Часто файл имеет только одну ссылку, но не всегда.

    (Однако помните, что символическая ссылка - это не то же самое, что жесткая ссылка. Символьная ссылка на файл не предотвращает потерю данных при удалении файла!)

Создание другой ссылки на файл

Чтобы успешно поэкспериментировать с жесткими ссылками, вы можете file1.txt существует и file2.txt не существует. Затем, когда вы бежите link file1.txt file2.txt, у вас будет две ссылки, file1.txt а также file2.txt, Когда ты бежишь ls -li вы увидите, что они имеют одинаковый номер инода.

Сейчас file1.txt а также file2.txt один и тот же файл.

Наконец, вы можете использовать ln вместо link, ln Команда используется чаще, защищает от некоторых ошибок и в некоторых системах имеет более приятные сообщения об ошибках. (Когда вы используете ln Команда без -s флаг, он создает жесткие ссылки, как и link команда. Проходя -s флаг заставляет вместо этого создать символическую ссылку.)

Дальнейшее чтение

Это зависит от того, как вы добавили этот текст. Если вы набрали echo foo >> fileу вас еще есть один файл. Некоторые текстовые редакторы удаляют исходный файл или переименовывают его для создания резервной копии, которая разрывает ссылку или оставляет ссылку, соединяющуюся с резервной копией.

Другие вопросы по тегам