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 не был изменен. Оба файла находятся в том же каталоге. Я использовал свой текстовый редактор для создания их.
Это зависит от того, как Вы добавили тот текст. Если Вы ввели echo foo >> file
, у Вас все еще есть единственный файл. Некоторые текстовые редакторы удалят исходный файл или переименуют его для создания резервного копирования, которое разорвет связь или оставит ссылку, соединяющуюся с резервным копированием.
TL; DR: Создание жесткой ссылки не создает отношения между различными файлами, которые заставляют новые изменения в одном быть отраженными в другом. Вместо этого это создает другое название того же файла. Ваш link
команда перестала работать, потому что Вы сказали ей создавать названную ссылку file2.txt
, но file2.txt
уже существовал.
Часто полезно иметь некоторый способ относиться к чему-то. Для некоторых вещей полезно иметь больше чем один путь. Это не ограничено вычислениями.
Например, "ацетаминофен" и "парацетамол" относятся к тому же лечению. Это корректно, чтобы сказать, что ацетаминофен является парацетамолом, и одинаково исправьте, чтобы сказать, что парацетамол является ацетаминофеном. Никакое имя не относится к другому - вместо этого, они обращаются к конкретному химическому веществу, которое не является тем же самым как ни одним из его имен.
Так же, как слово или фраза могут идентифицировать человека или вещь на естественном языке, ссылка - также звонила, жесткая ссылка - определяет файл, и некоторые файлы имеют несколько ссылок. Они не ссылки друг на друга, но в файл. (Быть точным, что они определяют, - inode файла. Посмотрите ниже.)
Когда существует несколько ссылок на файл, не то, чтобы файл имеет одно истинное имя, и другие являются ложными или меньшими именами. Вместо этого все ссылки обеспечивают названия файла, и ни один не зависит от других. Если кто-то просит у Вас название файла затем, неважно, какую из его жестких ссылок Вы указываете, Вы одинаково корректны.
link
, это не успешно выполнялось, и никакая ссылка не была создана.Когда link
сказанный Вас link: file2.txt: File exists
, это было на самом деле сообщением об ошибке. Поскольку файл file2.txt
уже существовал, link
команда не могла создать ссылку тем именем. Таким образом file1.txt
и file2.txt
все еще отдельные файлы, и именно так они могут иметь различное содержание.
link
команда не создает отношения между отдельными файлами. Это создает другое название того же самого файла. То имя может отличаться, или находиться в другом каталоге или обоих, но оно имеет те же отношения к файлу как его настоящее имя. Общее, хотя несколько неточная стенография Вы, возможно, услышали для этого, - то, что "жесткая ссылка является файлом".
Хотя это интуитивно многим пользователям, что каждый файл существует в конкретном каталоге и больше нигде и имеет всего одно имя, те вещи не верны. Вместо этого:
ls -li
(и нисколько когда Вы просто не работаете ls -l
). Два различных файла, находящиеся на том же устройстве всегда, имеют различные inode числа.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
." Внутренне никакой точки к другому, но вместо этого обе точки к тому же inode. rm
и unlink
команды удаляют ссылки. Когда мы работаем rm foo
, мы склонны думать об этом как об удалении foo
, но никакие данные в файле не потеряны, и никакое дисковое пространство, соответствующее файлу, не освобождено, пока все ссылки на файл не удалены. Часто файл имеет всего одну ссылку, но не всегда.
(Помните, однако, что символьная ссылка не является тем же самым как жесткой ссылкой. Символьная ссылка на файл не предотвращает потерю данных, когда файл удален!)
Для успешного экспериментирования с жесткими ссылками можно удостовериться file1.txt
действительно существует и file2.txt
не существует. Затем, когда Вы работаете link file1.txt file2.txt
, у Вас будет две ссылки, file1.txt
и file2.txt
. Когда Вы работаете ls -li
Вы будете видеть, что у них есть то же inode число.
Теперь file1.txt
и file2.txt
тот же файл.
Наконец, можно хотеть использовать ln
вместо link
. ln
команда является более наиболее часто используемой, гарантии против некоторых ошибок, и, в некоторых системах, имеет более хорошие сообщения об ошибках. (Когда Вы используете ln
команда без -s
флаг, это создает жесткие ссылки, как делает link
команда. Передача -s
отметьте причины создать символьную ссылку вместо этого.)