Я создаю сценарий оболочки, который берет имя файла / путь к файлу и определяет, является ли файл символической ссылкой или жесткой ссылкой.
Единственное, я не знаю, как узнать, являются ли они жесткой связью. Я создал 2 файла, один из которых является жесткой ссылкой, а другой - символической ссылкой для использования в качестве тестового файла. Но как мне определить, является ли файл жесткой ссылкой или символическим в сценарии оболочки?
Кроме того, как я могу найти целевой раздел символической ссылки? Допустим, у меня есть файл, который ссылается на другой раздел, как мне найти путь к этому исходному файлу?
shell-script
files
symlink
hard-link
к-Rocker
источник
источник
ln /foo/bar/ /foo/bar2
делает жесткую ссылку, в то время какln -s /foo/bar /foo/bar2
делает символическую ссылку, вот что он имеет в виду?bar2
иbar
обе жесткие ссылки, просто указывающие на один и тот же индекс.bar
иbar2
одинаково важны. Одна не является ссылкой на другую, они обе являются ссылками, но указывают на один и тот же индекс.ln
ничем не отличаются от обычных файлов.Ответы:
Ответ Джим объясняет , как проверить на линке: с помощью
test
«s-L
тест.Но тестирование на «жесткую ссылку», строго говоря, не то, что вы хотите. Жесткие ссылки работают из-за того, как Unix обрабатывает файлы: каждый файл представлен одним индексом. Тогда один инод имеет ноль или более имен или записей каталога или, технически, жестких ссылок (то, что вы называете «файлом»).
К счастью,
stat
команда, где она доступна, может сказать вам, сколько имен у inode.Итак, вы ищете что-то вроде этого (здесь предполагается реализация GNU или busybox
stat
):Этот
-c '%h'
бит говоритstat
просто выводить количество жестких ссылок на индекс, т. Е. Количество имен в файле.-gt 1
затем проверяет, больше ли это 1.Обратите внимание, что символические ссылки, как и любые другие файлы, также могут быть связаны с несколькими каталогами, поэтому вы можете иметь несколько жестких ссылок на одну символическую ссылку.
источник
stat -f %l /path/to/file
. Вы также можете использовать,gstat -c %h /path/to/file
если у вас установлены GNU coreutils без имен по умолчанию (с Homebrew на OS X).Пример:
В
f1
,f2
иf3
запись каталога и тот же файл (тот же индексный дескриптор: 10802124, вы заметите , количество ссылок является 3). Это жесткие ссылки на один и тот же обычный файл.s4
аs5
также тот же файл (10802384). Они имеют тип symlink , а не обычные . Они указывают на путь, здесьs3
. Посколькуs4
иs5
являются записями одного и того же каталога, этот относительный путьs3
указывает на один и тот же файл (файл с inod 10802347) для обоих.Если вы делаете
ls -Ll
, то запрашиваете информацию о файле после разрешения символических ссылок:Вы найдете, что они все разрешают к тому же файлу (10802124).
Вы можете проверить, является ли файл символической ссылкой
[ -L file ]
. Точно так же вы можете проверить, является ли файл обычным файлом[ -f file ]
, но в этом случае проверка выполняется после разрешения символических ссылок.Жесткие ссылки - это не тип файла, это просто разные имена для файла (любого типа).
источник
Использование
-h
и-L
операторыtest
команды:http://www.mkssoftware.com/docs/man1/test.1.asp
Согласно этому потоку SO , они ведут себя одинаково, но
-L
предпочтительнее.источник
inode
. Кроме того, программные ссылки показываютl
в началеls -l
вывода ... Я думаю, что вы можете объединить эти правила в сценарии, а также[[ -L file ]]
проверить, является ли данный файл мягким или жестким .Здесь много совершенно правильных ответов, но я не думаю, что кто-то действительно справился с первоначальным заблуждением. Исходный вопрос в основном заключается в том, что «когда я делаю символическую ссылку, впоследствии ее легко идентифицировать. Но я не могу понять, как определить жесткую ссылку». И да, ответы в основном сводятся к «вы не можете» и более или менее объясняют почему, но никто, кажется, не признал, что, действительно, это сбивает с толку и странно.
Если ты читаешь все это и понимаешь, что происходит, тогда ты в порядке; Вам не нужно читать мою маленькую часть. Если вы все еще в замешательстве, то продолжайте.
Действительно очень короткий ответ заключается в том, что жесткая ссылка на самом деле вовсе не ссылка, а не символическая ссылка. Это новая запись в структуре каталогов, которая указывает на тот же набор байтов, что и оригинальная запись каталога, и после того, как вы ее создали, она так же «реальна» и легитимна, как и первая. Каждый «нормальный» файл на вашем диске имеет хотя бы одну жесткую ссылку; без этого вы бы не увидели ни в одномкаталог, и не сможет ссылаться на него или использовать его. Поэтому, если у вас есть файл Fred.txt и вы жестко связываете с ним Wilma.txt и Barney.txt, все три имени (и записи каталога) ссылаются на один и тот же файл, и все они одинаково действительны. Для ОС нет никакого способа сказать, что одна из записей была создана, когда вы нажали «сохранить» в текстовом редакторе, а другие были сделаны с помощью команды «ln».
ОС действительно должны отслеживать , сколько различных записей , указывающих на тот же файл, хотя. Если вы удалите Wilma.txt, не удивительно, что вы не освободите место на диске. Но если вы удалите Fred.txt («оригинальный» файл), вы все равно не освободите место на диске, потому что данные на диске, который был известен как Fred.txt, по-прежнему также Barney.txt. Только когда вы удалите все записи каталога, ОС освободит место, которое занимали сами данные.
Если бы Barney.txt был символической ссылкой, то удаление Fred.txt освободило бы пространство, а Barney.txt теперь было бы неработающей ссылкой. Кроме того, если вы переместите или переименуете файл, на который указывает символическая ссылка, вы нарушите эту ссылку. Но вы можете перемещать или переименовывать жестко связанный файл, как вам угодно, не нарушая другие записи каталога, которые указывают на этот файл / данные, поскольку все они являются записями каталога, которые ссылаются на один и тот же блок данных на диске (с помощью индекс # этих данных).
[Прошло два года, и это последнее немного смутило меня , так что я думаю, что уточнить. Если вы наберете «mv ./Wilma.txt ../elsewhere/Betty.txt», то, похоже, вы перемещаете файл, но на самом деле это не так. Что вы действительно делаете, так это удаляете элемент строки из списка каталогов вашего текущего каталога, тот, который говорит, что «имя« Wilma.txt »связано с данными, которые можно найти с помощью inode ###### #, "и добавление новой позиции в список каталогов каталога ../elsewhere, где говорится, что" имя 'Betty.txt' связано с данными, которые можно найти через inode ####### ". Вот почему вы можете «переместить» файл размером 2 гигабайта так же быстро, как файл размером 2 килобайта, при условии, что вы перемещаете их в другое место на том же диске.]
Поскольку ОС должна отслеживать, сколько разных записей каталога указывают на один и тот же кусок данных, вы можете определить, была ли жесткая ссылка на конкретный файл, даже если вы не можете точно сказать, является ли эта запись каталога Вы смотрите на «оригинал» или нет. Одним из способов является команда «ls», а именно «ls -l» (это строчная буква L после тире)
Заимствовать более ранний пример ....
Первая буква - тире, так что это не каталог или что-то еще экзотическое, это обычный файл. Но если бы оно было действительно обычным, это число после части rwx-ish было бы «1», как, например, «есть одна запись каталога, указывающая на этот блок данных». Но это часть демонстрации жестких ссылок, поэтому вместо этого написано «3».
Обратите внимание, что это может привести к странному и таинственному поведению (то есть, если вы не обернулись вокруг жестких ссылок). Если вы откроете Fred.txt в текстовом редакторе и внесете некоторые изменения, увидите ли вы те же изменения в Wilma.txt и Barney.txt? Может быть. Вероятно. Если ваш текстовый редактор сохраняет изменения, открыв исходный файл и записав в него изменения, то да, все три имени будут по-прежнему указывать на один и тот же (недавно измененный) текст. Но если ваш текстовый редактор создает новый файл (Fred-new-temp.txt), записывает в него измененную версию, затем удаляет Fred.txt, а затем переименовывает Fred-new-temp.txt в Fred.txt, Вильма и Барни по-прежнему указывать на оригинальную версию, а не на новую измененную версию. Если вы не понимаете жестких ссылок, это может привести вас в бешенство. :) [Ладно, я лично не знаю ни одноготекстовые редакторы, которые будут выполнять функцию new-file / rename, но я знаю много других программ, которые делают именно это, так что будьте начеку.]
И последнее замечание: одна из вещей, которую проверяет fsck (проверка файловой системы), состоит в том, есть ли на вашем диске блоки данных, на которые почему-то больше не ссылаются какие-либо записи каталога. Иногда что-то идет не так, и единственная запись в каталоге, которая указывает на индекс, удаляется, но само пространство диска не помечается как «доступное». Таким образом, одна из задач fsck - сопоставить все выделенное пространство со всеми записями каталога, чтобы убедиться, что нет никаких файлов, на которые нет ссылок. Если он находит некоторые, он создает новые записи каталога и помещает их в «lost + found».
источник
Вы можете использовать
readlink FILE; echo $?
. Возвращает 1, когда это жесткая ссылка, и 0, когда это символическая ссылка.Со страницы руководства: «Когда вызывается как ссылка для чтения, печатается только цель символической ссылки. Если данный аргумент не является символической ссылкой, readlink ничего не напечатает и завершится с ошибкой».
источник