В чем разница между жесткой ссылкой и символической ссылкой?

Это хорошая форма и уменьшает путаницу, чтобы запустить все сценарии оболочки, объявив оболочку, в которой они должны запускаться. Первая строка для оболочки Borne (то, что вы назвали «.sh») - «#!/bin/sh». Это помогает устранить всю путаницу в отношении оболочки, в которой каждая имеет нюансы в своем синтаксисе и структуре команд.

Для оболочки Borne команда if выглядит более похожей на это: if [$ rule = "deps"] ; затем # процесс, основанный на HOSTTYPE fi

Пара других предложений, они могут не быть проблемой здесь, но могут укусить вас со временем.

1- определить согласованное соглашение об именах имен, например все в верхнем регистре, чтобы вы могли легче читать код и идентифицировать переменные. 2- Используйте фигурные скобки для обозначения переменных, чтобы они не могли «запутаться». 3. При сравнении строк также помещайте свои переменные в кавычки.

Итак, давайте изменим первую строку из

if ($rule == "") set rule="all"

на

if [ "${rule}XXX" = "XXX" ]; rule="all"

Вьющиеся скобки защищают запутывание с XXX, этот синтаксис говорит, что значение переменной «rule» с «XXX» добавлено до конца. Итак, если результат равен только XXX, вы знаете, что переменная была пуста или null.

Для типа хоста вы можете попробовать добавить еще одну строку, например, для правила:

set HOSTTYPE=$2
[d8 ], а затем, когда вы запустите скрипт, добавьте второй параметр, в который вы вводите тип хоста, например [F6]

1
задан 17 October 2014 в 16:30

9 ответов

Жесткая ссылка не является указателем на файл, это запись в каталоге (файл), указывающая на тот же индекс. Даже если вы измените имя другого файла, жесткая ссылка все еще указывает на файл. Если вы замените другой файл на новую версию (скопировав ее), жесткая ссылка не будет указывать на новый файл. Вы можете иметь только жесткие ссылки в одной и той же файловой системе. С hardlinks у вас нет концепции исходных файлов и ссылок, все они равны (подумайте об этом как ссылку на объект). Это концепция очень низкого уровня.

С другой стороны, символическая ссылка фактически указывает на другой путь (имя файла); он разрешает имя файла каждый раз, когда вы обращаетесь к нему через символическую ссылку. Если вы переместите файл, символическая ссылка не будет следовать. Если вы замените файл на другой, сохранив имя, символическая ссылка укажет на новый файл. Символы могут охватывать файловые системы. С символическими ссылками у вас есть очень четкое различие между фактическим файлом и символической ссылкой, в котором нет информации рядом с файлом о файле, на который он указывает.

305
ответ дан 25 May 2018 в 13:51
  • 1
    Вещь, которая (по собственным словам) "указывает на файл" , может называться указателем (тривиально почти тавтологически верно). Если мы nitpicking, то (вообще) понятие hardlinks может существовать, даже если файловая система не использует inodes. – jfs 18 June 2016 в 21:56

«Картина стоит тысячи слов».

И «Пример стоит сто абзацев ...»

Создайте два файла:

$ touch blah1   
$ touch blah2

Enter некоторые данные в них:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

И как ожидалось:

$cat blah1; cat blah2
Cat
Dog

Давайте создадим жесткие и непрямые ссылки:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Давайте посмотрим, что именно произошло:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Изменение имени blah1 не имеет значения:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard указывает на inode, содержимое файла - это не было Изменен.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

Содержимое файла невозможно найти, потому что мягкая ссылка указывает на имя, которое было изменено, а не на содержимое. Аналогично, если blah1 удаляется, blah1-hard все еще сохраняет содержимое; Если blah2 удален, blah2-soft - это просто ссылка на несуществующий файл.

источник: наглядно копирование его из

281
ответ дан 25 May 2018 в 13:51
  • 1
    Чтобы быть справедливым для вас - вы добавили прекрасное изображение наверху ... а вы тоже это скопировали! Сочетание двух ответов на самом деле очень полезно :) – icc97 22 January 2017 в 17:28
  • 2
    лучше объяснить, нигде! – dennisbot 22 June 2017 в 22:49
  • 3
    Я продолжал смотреть на изображение в течение 20 секунд, а затем, внезапно, я понял это. Это на самом деле блестяще. – MJoraid 28 July 2017 в 10:05
  • 4
    btw: Использование hardlinks с git - плохая идея , на всякий случай кто-то (расстроенный по мягким ссылкам) чудес ... может применяться и к другим системам управления версиями. – Frank Nocke 18 September 2017 в 15:43
  • 5
    Является ли inode его жесткими ссылками, подобными файлу, хранящемуся в облаке, любому устройству, к которому он обращается? – Ooker 19 January 2018 в 16:24

Оба являются указателями на файлы; разница - это вид указателя. Символьная ссылка указывает на другой файл по имени. Он имеет специальный бит режима, который идентифицирует его как символическую ссылку, а ее содержимое - это имя реального файла. Поскольку он просто содержит имя, это имя фактически не должно существовать или может существовать в другой файловой системе. Если вы замените именованный файл (измените его содержимое, не затрагивая его имя), ссылка все еще будет содержать одно и то же имя, и теперь он указывает на новый файл. Вы можете легко идентифицировать символическую ссылку и увидеть имя файла, на который он указывает.

Жесткая ссылка указывает на файл по номеру inode. Таким образом, жесткие ссылки не отличаются от имени файла. Нет никакого «реального» имени или имени жесткой ссылки; все жесткие ссылки являются одинаково допустимыми именами для файла. Из-за этого файл, на который вы ссылаетесь, должен фактически существовать и находиться в той же файловой системе, где вы пытаетесь создать ссылку. Если вы удалите исходное имя, жесткая ссылка все равно указывает на тот же файл. Поскольку все жесткие ссылки являются одинаково допустимыми именами для файла, вы не можете смотреть на них и видеть другие имена файла; Чтобы найти это, вам нужно взглянуть на каждый файл и сравнить их номер inode, чтобы найти другое имя (имена), которое имеет тот же номер inode.

Вы можете указать, сколько имен имеет файл из вывода ls -l. Первое число после файлового режима - это количество ссылок. Файл с более чем 1 ссылкой имеет другое имя (-ы) где-то, и, наоборот, файл со счетом, связанным только с 1, не имеет (других) жестких ссылок.

87
ответ дан 25 May 2018 в 13:51
  • 1
    If you replace the named file, then the link still contains the same name, and so now it points to the new file - Я думаю, что это не совсем понятно. Вы имеете в виду, если я заменю файл, где я получил символическую ссылку, тогда ссылки, содержащие имя, остаются нетронутыми. Но он будет указывать только на замененный файл, когда его имя файла (то есть новый файл, который заменил старый), совпадает с замененным (то есть старым файлом, который был заменен новым), правильно ли? – Mike 18 April 2015 в 01:29
  • 2
    @Mike, да: символическая ссылка указывает на исходное имя файла, поэтому замена этого файла означает, что ссылка теперь указывает на новый файл. – psusi 18 April 2015 в 04:32
  • 3
    Но только если оно получило одно и то же имя? Если бы символическая ссылка указывала на банан, и я заменяю файл оранжевым, тогда ссылка sy не может найти файл банана больше, то есть он не будет работать – Mike 18 April 2015 в 11:08
  • 4
    @Mike, мир заменить означает, что он имеет то же имя, иначе вы просто удаляете один файл и добавляете другое;) – psusi 18 April 2015 в 19:28

Жесткая ссылка может работать только в одной и той же файловой системе, это просто другое имя для того же inode (файлы внутренне ссылаются на inodes). Файл будет удален только с диска, когда последняя ссылка на его inode исчезнет (вы rm d или unlink d последняя ссылка). Hardlinks обычно работают только для файлов, а не для каталогов.

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

56
ответ дан 25 May 2018 в 13:51
  • 1
    Спасибо, это говорит мне, как они работают, но что конкретно делает жесткая ссылка? И почему он не работает для каталогов? – ste_kwr 1 March 2012 в 00:41
  • 2
    @knittl: ты уверен? Кажется, что в некоторых файловых системах жесткие ссылки на каталоги разрешены, но только root может их создать. См. Переключатели -d, -F, --directory. И да, я видел заметку на странице ln(1) :) – 0xC0000022L 1 March 2012 в 01:08
  • 3
    @kniwor: самый простой способ описать hardlinks - это просто другое имя для того же файла (то есть данных на диске) & quot ;. И - по крайней мере, на моей системе (ы) - ln нельзя использовать для создания ссылок на каталоги. Существуют жесткие ссылки на каталоги, хотя наиболее ярким примером является . и ... Я не хотел включать это в свой первоначальный ответ, поскольку это только усложнит ситуацию. – knittl 1 March 2012 в 16:26
  • 4
    @STATUS_ACCESS_DENIED: хорошо, хорошо ... но обычно это не очень хорошая идея. Вот почему я написал «обычно» в своем первоначальном ответе. Также см. Мои предыдущие комментарии для примеров. – knittl 1 March 2012 в 16:29
  • 5
    поэтому жесткая ссылка может указывать на одну и ту же папку / файл с разными именами, например, с разными именами, которые ссылаются на один и тот же индекс? – Charlie Parker 10 April 2017 в 20:38

Один из ответов другого потока (теперь связанный с верхней части вашего сообщения) упоминает эту страницу, которая, по моему мнению, является довольно хорошим объяснением среднего уровня. Если вы теряетесь в искусстве ascii, вот версия tl; dr:

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

Ядро и используемые файловые системы трансформируют все прозрачно.

Итак, на основе этого:

Стандартные файлы - это указатель из файловой системы в индексный дескриптор, который в свою очередь, указывают на физические данные. Файловый компонент сохраняет ссылку на файловую систему (по существу, ее путь) и ссылку на индекс. Жесткие ссылки (по существу) указывают на абсолютные данные. Символы могут указывать на относительные пути (например, ../parent.file) Жесткие ссылки - это точно такие же файлы. Это просто дополнительный указатель непосредственно на индексный дескриптор. Устранение жесткой ссылки будет быстрее, но неизмеримо. Эта незначительная часть скорости идет за счет негибкой файловой системы.

Возможно, я немного смутил себя, но, читая разные вещи, я изо всех сил стараюсь найти разницу между стандартным файлом и жесткой линией. Как я его читаю, каждый файл состоит из жесткой ссылки (сохранение имени файла), связываясь с индедом, который указывает на физические данные.

Добавление жесткой ссылки просто предоставляет индексный дескриптор с дополнительной файловой системой указатель. Правильно?

20
ответ дан 25 May 2018 в 13:51
  • 1
    Я думаю, что вы правы, каждый файл - это путь к inode, а жесткая ссылка - это дополнительное имя пути для того же inode. Таким образом, жесткая ссылка не отличается от обычного файла. – enzotib 18 May 2011 в 20:20
  • 2
    Я пытаюсь понять это ... но вы говорите: & gt; «Символические ссылки - это отдельные файлы (включая отдельный индекс inode и данные ), которые хранят путь файловой системы к файлу. " Действительно ли символическая ссылка имеет отдельные данные? Тогда это точно так же, как копия каталога, на который он ссылается, не так ли? ... и каждый раз, когда что-то записывается в символическую ссылку, оно должно быть записано дважды на диск? Без разницы. – MiniGod 30 December 2012 в 05:43
  • 3
    @MiniGod Символьная ссылка не является inode блоком данных, который хранит путь к другому inode (filename). Да, это Матрица - как смущающая, но как только вы ее получите, вы никогда не забудете :) – Oli♦ 30 December 2012 в 05:48
  • 4
    @ Oli Я мог бы смутить, но когда вы говорите: «включая отдельный индекс и данные », вы подразумеваете, что символическая ссылка имеет отдельные данные !? – MiniGod 31 December 2012 в 07:34
  • 5
    @MiniGod Да. Symlink - это индекс, указывающий на данные (как обычный файл), а данные - путь. Это немного более умно, чем это - позволить прозрачное использование через символические ссылки, но это по существу все, что они есть. – Oli♦ 31 December 2012 в 08:21

Когда использовать Soft Link:

Ссылка на файловые системы: если вы хотите связать файлы по файловым системам, вы можете использовать только ссылки symlinks / soft.

Ссылки на каталог: Если вы хотите связать каталоги, вы должны использовать Soft-ссылки, так как вы не можете создать жесткую ссылку на каталог.

Когда использовать Hard Link:

Место для хранения : Жесткие ссылки занимают очень незначительное количество места, так как нет новых inodes, созданных при создании жестких ссылок. В мягких ссылках мы создаем файл, который потребляет пространство (обычно 4 КБ, в зависимости от файловой системы).

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

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

15
ответ дан 25 May 2018 в 13:51
  • 1
    Обратите внимание, что существует также быстрая символическая ссылка для размера пути до 64 байтов. Он по-прежнему занимает один индекс, но не использует блок 4kb. – syockit 21 January 2015 в 14:57

Путаница возникает, когда вы пытаетесь найти разницу между «именем файла» и жесткой ссылкой, потому что ее нет.

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

Из этого вы можете видеть, что фактические данные никогда не удаляются, только жесткая ссылка (s ) находятся. И когда он становится достаточно переполненным на диске, данные могут быть перезаписаны данными другого файла. До сих пор данные из удаляемого файла могут быть восстановлены, но его трудно найти без жесткой ссылки.

Символы, как объяснялось ранее, просто говорят вам: «есть файл с именем <targetname> в папку с именем <targetfolder> ". Они указывают на жесткую связь. Они не знают, где находятся данные. Жесткая ссылка знает это.

7
ответ дан 25 May 2018 в 13:51

Для отличного объяснения noob-and-ex-Windoze-user-friendly, с хорошими диаграммами и часто задаваемыми вопросами обращайтесь на эту страницу http://www.geekride.com/hard-link-vs-soft-link/.

Это моя вторая или даже третья попытка схватывания загадки мягкой / жесткой ссылки, всегда бросающей в полотенце и откладывая мое понимание на неопределенный промежуток времени в будущем - как только объяснения и man-страницы получат глубокое ядро ​​и сверхтехнические с помощью inodes и все ...

Наслаждайтесь! [!d9 ]

3
ответ дан 25 May 2018 в 13:51

Это очень просто. Файлы (и каталоги!) Хранятся по адресам на блочном устройстве (HDD или любой другой). Обычно у вас есть одно имя, сопоставленное с адресом, и именно так вы получаете свой файл. Жесткая ссылка - это второе, третье и т. Д. Имя, сопоставленное с тем же адресом. Символическая ссылка вместо этого ссылается на символ - имя - и, следовательно, второе имя сопоставляется с первым именем. Что касается ядра, как только он читает цель символической ссылки, он останавливается и возвращается к началу с целевым значением в качестве имени файла (более или менее), так что относительные символические ссылки возможны, но безумно бесполезны. Имя цели не используется выше уровня файловой системы, кроме случаев, когда оно явно запрашивается в коде пользовательского пространства.

0
ответ дан 25 May 2018 в 13:51

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

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