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

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
задан 21 January 2017 в 07:17

2 ответа

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

0
ответ дан 2 December 2019 в 02:48

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

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

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

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

Так же, как слово или фраза могут идентифицировать человека или вещь на естественном языке, ссылка - также звонила, жесткая ссылка - определяет файл, и некоторые файлы имеют несколько ссылок. Они не ссылки друг на друга, но в файл. (Быть точным, что они определяют, - inode файла. Посмотрите ниже.)

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

Когда Вы работали link, это не успешно выполнялось, и никакая ссылка не была создана.

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

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

Links и Inodes

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

  • Содержание файла может быть физически распространено всюду по диску.
  • Метаданные о том, где найти содержание файла, а также владельца, владельца группы, полномочия и любые расширенные атрибуты файла, хранятся в структуре данных, названной inode. (inode также содержит некоторую другую информацию.)
  • Для каждого отличного файла существует точно один inode, и каждый inode отождествляется с числом. Это inode число является числом, показанным в левом столбце, когда Вы работаете ls -li (и нисколько когда Вы просто не работаете ls -l). Два различных файла, находящиеся на том же устройстве всегда, имеют различные inode числа.
  • Полезно смочь думать о файле как о наличии имени, и как нахождение где-нибудь в иерархии каталогов. Поэтому файл может иметь одну или несколько ссылок (также названный жесткими ссылками, так как существует что-то еще позвонившее "мягкая" или "символьная" ссылка). Каждая ссылка имеет точно одно название и местоположение. Ссылки файла являются ссылками на inode.
  • 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 отметьте причины создать символьную ссылку вместо этого.)

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

3
ответ дан 2 December 2019 в 02:48

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

Похожие вопросы: