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