Используя команду 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.txtMsgstr "Внутренне ни один не указывает на другой, но вместо этого оба указывают на один и тот же индекс. 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 флаг заставляет вместо этого создать символическую ссылку.)
Дальнейшее чтение
- Почему существуют жесткие ссылки?
- Что происходит, когда вы удаляете жесткую ссылку?
- Почему жесткие ссылки на каталоги не разрешены в UNIX/Linux?
- Как определить, какой файл является оригинальным, если создана жесткая ссылка
- В чем разница между символической ссылкой и жесткой ссылкой? (Переполнение стека)
- В чем разница между жесткой ссылкой и символической ссылкой? (Спросите Ubuntu)
- Что такое суперблок, инод, дентри и файл?
Это зависит от того, как вы добавили этот текст. Если вы набрали echo foo >> fileу вас еще есть один файл. Некоторые текстовые редакторы удаляют исходный файл или переименовывают его для создания резервной копии, которая разрывает ссылку или оставляет ссылку, соединяющуюся с резервной копией.