Как найти все жесткие ссылки файла testfile linux

Обновлено: 03.07.2024

Очень важно уметь вовремя найти нужную информацию в системе. Конечно, все современные файловые менеджеры предлагают отличные функции поиска, но им не сравнится с поиском в терминале Linux. Он намного эффективнее и гибче обычного поиска, вы можете искать файлы не только по имени, но и по дате добавления, содержимому, а также использовать для поиска регулярные выражения.

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

Основная информация о Find

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

Утилита find предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.

Команда find имеет такой синтаксис:

find [ папка] [ параметры] критерий шаблон [действие]

Папка - каталог в котором будем искать

Параметры - дополнительные параметры, например, глубина поиска, и т д

Критерий - по какому критерию будем искать: имя, дата создания, права, владелец и т д.

Шаблон - непосредственно значение по которому будем отбирать файлы.

Основные параметры команды find

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

  • -P - никогда не открывать символические ссылки.
  • -L - получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
  • -maxdepth - максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
  • -depth - искать сначала в текущем каталоге, а потом в подкаталогах.
  • -mount искать файлы только в этой файловой системе.
  • -version - показать версию утилиты find.
  • -print - выводить полные имена файлов.
  • -type f - искать только файлы.
  • -type d - поиск папки в Linux.

Критерии

Критериев у команды find в Linux очень много, и мы опять же рассмотрим только основные.

  • -name - поиск файлов по имени.
  • -perm - поиск файлов в Linux по режиму доступа.
  • -user - поиск файлов по владельцу.
  • -group - поиск по группе.
  • -mtime - поиск по времени модификации файла.
  • -atime - поиск файлов по дате последнего чтения.
  • -nogroup - поиск файлов, не принадлежащих ни одной группе.
  • -nouser - поиск файлов без владельцев.
  • -newer - найти файлы новее чем указанный.
  • -size - поиск файлов в Linux по их размеру.

Примеры использования

А теперь давайте рассмотрим примеры find, чтобы вы лучше поняли, как использовать эту утилиту.

1. Поиск всех файлов

Показать все файлы в текущей директории:


Все три команды покажут одинаковый результат. Точка здесь означает текущую папку. В место неё можно указать любую другую.

2. Поиск файлов в определенной папке

Показать все файлы в указанной директории:


Искать файлы по имени в текущей папке:


Поиск по имени в текущей папке:

find . -name "testfile*"

Не учитывать регистр при поиске по имени:

find . -iname "TeStFile*"


3. Ограничение глубины поиска

Поиска файлов по имени в Linux только в этой папке:

find . -maxdepth 1 -name "*.php"

4. Инвертирование шаблона

Найти файлы, которые не соответствуют шаблону:

find . -not -name "test*"

5. Несколько критериев

Поиск командой find в Linux по нескольким критериям, с оператором исключения:

find . -name "test" -not -name "*.php"

Найдет все файлы, начинающиеся на test, но без расширения php. А теперь рассмотрим оператор ИЛИ:

find -name "*.html" -o -name "*.php"

Эта команда найдёт как php, так и html файлы.

6. Тип файла

По умолчанию find ищет как каталоги, так и файлы. Если вам необходимо найти только каталоги используйте критерий type с параметром d. Например:

find . -type d -name "Загрузки"


Для поиска только файлов необходимо использовать параметр f:

find . -type f -name "Загрузки"


6. Несколько каталогов

Искать в двух каталогах одновременно:

find ./test ./test2 -type f -name "*.c"

7. Поиск скрытых файлов

Найти скрытые файлы только в текущей папке. Имена скрытых файлов в Linux начинаются с точки:

find . -maxdepth 1 -type f -name ".*"


8. Поиск по разрешениям

Найти файлы с определенной маской прав, например, 0664:

find . -type f -perm 0664

Права также можно задавать буквами для u (user) g (group) и o (other). Например, для того чтобы найти все файлы с установленным флагом Suid в каталоге /usr выполните:

sudo find /usr -type f -perm /u=s


Поиск файлов доступных владельцу только для чтения только в каталоге /etc:

find /etc -maxdepth 1 -perm /u=r


Найти только исполняемые файлы:

find /bin -maxdepth 2 -perm /a=x

9. Поиск файлов в группах и пользователях

Найти все файлы, принадлежащие пользователю:

find . -user sergiy

Поиск файлов в Linux принадлежащих группе:

find /var/www -group www-data


10. Поиск по дате модификации

Поиск файлов по дате в Linux осуществляется с помощью параметра mtime. Найти все файлы модифицированные 50 дней назад:

Поиск файлов в Linux открытых N дней назад:

Найти все файлы, модифицированные между 50 и 100 дней назад:

find / -mtime +50 -mtime -100

Найти файлы измененные в течении часа:

11. Поиск файлов по размеру

Найти все файлы размером 50 мегабайт:

От пятидесяти до ста мегабайт:

find / -size +50M -size -100M

Найти самые маленькие файлы:

find . -type f -exec ls -s <> \; | sort -n -r | head -5

find . -type f -exec ls -s <> \; | sort -n | head -5

12. Поиск пустых файлов и папок

find /tmp -type f -empty


13. Действия с найденными файлами

Для выполнения произвольных команд для найденных файлов используется опция -exec. Например, для того чтобы найти все пустые папки и файлы, а затем выполнить ls для получения подробной информации о каждом файле используйте:

find . -empty -exec ls -ld <> \;


Удалить все текстовые файлы в tmp

find /tmp -type f -name "*.txt" -exec rm -f <> \;

Удалить все файлы больше 100 мегабайт:

find /home/bob/dir -type f -name *.log -size +100M -exec rm -f <> \;

Выводы

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

Вы можете получить меню GRUB, нажав клавишу Shift во время загрузки вашей системы.

Это покажет все обычные файлы с несколькими ссылками (именем). Он не скажет вам, какие имена связаны с одним и тем же файлом, для чего вы можете использовать -samefile или -inum, например. find -samefile "$somefile"

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

В качестве примера:

+1 Это хороший ответ :-) Я буду «заимствовать у него» на мой ответ. – sudodus 2 November 2017 в 23:22 -links +1 является расширением GNU. Для лучшей переносимости (соответствие POSIX) используйте эквивалент \! -links 1, как в: find . -type f \! -links 1. Кроме того, -samefile также является расширением GNU, для которого нет простого эквивалента POSIX (по крайней мере, не внутри find). – Wildcard 3 November 2017 в 02:26 @Wildcard, да. Хотя я еще не видел систему Ubuntu с пользовательским пространством, отличным от GNU. – ilkkachu 4 November 2017 в 03:26 Ах, это правда. Я часто посещаю Unix & amp; Linux SE и, как правило, забывают, что переносимость здесь не такая уж большая проблема. :) – Wildcard 4 November 2017 в 05:09

Это покажет все обычные файлы с несколькими ссылками (именем). Он не скажет вам, какие имена связаны с одним и тем же файлом, для чего вы можете использовать -samefile или -inum, например. find -samefile "$somefile"

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

В качестве примера:

$ touch a b c $ ln b b2 ; ln c c2 $ find -type f -links +1 ./c2 ./b ./b2 ./c $ find -samefile b ./b ./b2

Это покажет все обычные файлы с несколькими ссылками (именем). Он не скажет вам, какие имена связаны с одним и тем же файлом, для чего вы можете использовать -samefile или -inum, например. find -samefile "$somefile"

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

В качестве примера:

$ touch a b c $ ln b b2 ; ln c c2 $ find -type f -links +1 ./c2 ./b ./b2 ./c $ find -samefile b ./b ./b2

Поиск жестких ссылок

Ответы @ ilkkachu и @ barrycarter хорошие. Этот ответ является альтернативой, которая описывает некоторые результаты с более подробными сведениями.

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

Ниже приведен пример, когда в текущем каталоге найдена одна жестко связанная пара, а два жестко связанных соответствия находятся в другом каталоге путем поиска из точки монтирования /media/multimed-2 данных раздел

Другие причины, по которым используется различный объем дискового пространства

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

Если связанное в том же дереве каталогов, вы найдете их напрямую.

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

Теоретически жесткие ссылки должны быть неотличимы от обычных файлов (это своего рода точка). Если «x» является жесткой ссылкой на «y», тогда «y» также является жесткой ссылкой на «x». При этом второй столбец ls -l сообщает вам, сколько ссылок есть в данном файле. Если это число больше 1, файл имеет или имеет жесткую ссылку где-то. Возможно, это не работает для каталогов, но я не знаю, почему. Сначала я сказал, что каждый файл в каталоге имеет ссылку на этот каталог, но я был не прав: я нашел каталог с 10 файлами, чей «счетчик ссылок» был только 2.

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

Чтобы найти все жесткие ссылки сразу, find вытащить inodes для всех файлов на устройстве, а затем используйте такие вещи, как sort и uniq, чтобы найти дубликаты.

Технически, жесткая ссылка - это просто ассоциация имени файла с некоторыми данными. Каждый нормальный файл (т. Е. Не символические ссылки, устройства и т. Д.) Является жесткой линией. Поэтому я жаловался, что " Если это число больше 1, файл имеет или имеет где-то жесткую ссылку " не является довольно точным; Я бы предпочел, чтобы это говорило «. у файла есть еще одна hardlink где-нибудь». или что-то типа того. Однако это второстепенный момент. – David Z 3 November 2017 в 00:37 @DavidZ Это незначительно, но актуально, потому что люди легко упускают из виду этот факт. То, что действительно хочет OP, - это список всех файлов, которые не являются каталогами, и имеют 2 или более ссылок. – Monty Harder 3 November 2017 в 19:07

Вы можете сделать что-то вроде этого:

find . -type t -ls | grep -v " 1 username"

Это приведет к отображению файлов в текущем каталоге и выполнению на нем ls. Как сказал @barrycarter, жесткие ссылки неотличимы от реальных файлов, но в этом листинге они будут отображаться как имеющие более одной ссылки. Используя grep -v, вы отсеиваете файлы, имеющие только одну ссылку. (Команда username в команде grep должна сделать grep в нужном месте для единственного 1. Замените свое собственное имя пользователя.)

Теоретически жесткие ссылки должны быть неотличимы от обычных файлов (это своего рода точка). Если «x» является жесткой ссылкой на «y», тогда «y» также является жесткой ссылкой на «x». При этом второй столбец ls -l сообщает вам, сколько ссылок есть в данном файле. Если это число больше 1, файл имеет или имеет жесткую ссылку где-то. Возможно, это не работает для каталогов, но я не знаю, почему. Сначала я сказал, что каждый файл в каталоге имеет ссылку на этот каталог, но я был не прав: я нашел каталог с 10 файлами, чей «счетчик ссылок» был только 2.

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

Чтобы найти все жесткие ссылки сразу, find вытащить inodes для всех файлов на устройстве, а затем используйте такие вещи, как sort и uniq, чтобы найти дубликаты.

Вы можете сделать что-то вроде этого:

find . -type t -ls | grep -v " 1 username"

Это приведет к отображению файлов в текущем каталоге и выполнению на нем ls. Как сказал @barrycarter, жесткие ссылки неотличимы от реальных файлов, но в этом листинге они будут отображаться как имеющие более одной ссылки. Используя grep -v, вы отсеиваете файлы, имеющие только одну ссылку. (Команда username в команде grep должна сделать grep в нужном месте для единственного 1. Замените свое собственное имя пользователя.)

Поиск жестких ссылок

Ответы @ ilkkachu и @ barrycarter хорошие. Этот ответ является альтернативой, которая описывает некоторые результаты с более подробными сведениями.

Если связанное соответствие в том же дереве каталогов, вы найдете их напрямую. В противном случае вы можете искать во всей файловой системе из точки монтирования, но только в пределах той же файловой системы, использующей -xdev, что важно при поиске в корневом разделе /, и есть другие смонтированные разделы. $ sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt

Ниже приведен пример, когда в текущем каталоге найдена одна жестко связанная пара, а два жестко связанных соответствия находятся в другом каталоге путем поиска из точки монтирования /media/multimed-2 данных раздел

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

Для понимания концепции ссылок на файлы в рамках файловой системы следует в первую очередь разобраться со структурами inode .

Структуры inode

Содержимое структуры inode

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

Как видно в следующем примере, при использовании команды ls -l выводятся некоторые данные, содержащиеся в структуре inode.

Таблица структур inode

Таблица структур inode содержит информацию о всех структурах inode и создается в момент создания файловой системы (с помощью утилиты mkfs ). Вы можете использовать команду df -i для получения информации о количестве используемых и доступных для использования структур inode в рамках смонтированных файловых систем.

В приведенном выше примере вывода команды df -i вы можете обнаружить процентные показатели использования структур inode для некоторых смонтированных файловых систем . Данный показатель не приводится для устройства /dev/sdb5 ввиду того, что на этом устройстве используется файловая система fat .

Идентификатор структуры inode

Каждая структура inode имеет уникальный идентификатор (идентификатор структуры inode). Вы можете увидеть идентификаторы структур inode в выводе команды ls -li .

Три этих файла создавались последовательно, причем им соответствуют три различные структуры inode (идентификаторы которых выводятся в первом столбце). Вся информация из вывода данной команды ls , за исключением имен файлов (которые хранятся в файле директории), содержится в структурах inode .

Структуры inode и содержимое файлов

Давайте запишем немного данных в один из рассматриваемых файлов.

Данные, выводимые при использовании команды cat , содержатся не в структуре inode , а где-то на диске. Структура inode содержит указатель на эти данные.

О директориях

Директория является таблицей

Директория является особым видом файла, который содержит таблицу соответствия между именами файлов и структурами inode. При выводе списка содержимого директории с помощью команды ls -ali на самом деле будет осуществляться вывод содержимого файла директории.

Директории . и ..

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

Жесткие ссылки

Создание жестких ссылок

В момент создания жесткой ссылки с помощью утилиты ln в файл директории добавляется дополнительная запись. Новое имя файла ставится в соответствие существующей структуре inode.

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

Поиск жестких ссылок

Вы можете использовать утилиту find для поиска файлов с определенными идентификаторами структур inode. В примере ниже показана методика поиска всех имен файлов, которые соответствуют структуре inode с идентификатором 817270. Помните о том, что идентификатор структуры inode является уникальным для используемого раздела диска.

Символьные ссылки

Символьные ссылки (иногда называемые мягкими ссылками ) не указывают на структуры inode, а являются соответствиями между именами файлов. Символьные ссылки создаются с помощью команды ln -s . Как вы можете увидеть в примере ниже, символьная ссылка имеет собственную структуру inode.

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

Удаление ссылок

Ссылки на файлы могут удаляться с помощью утилиты rm .

Практическое задание: ссылки на файлы

1. Создайте два файла с именами winter.txt и summer.txt, поместите какие-либо текстовые данные в них.

2. Создайте жесткую ссылку на файл winter.txt с именем hlwinter.txt.

3. Выведите информацию об идентификаторах структур inode, соответствующих этим трем файлам, жесткие ссылки должны использовать структуры inode файлов, на которые они ссылаются.

4. Используйте утилиту find для вывода информации о файлах, на которые установлены жесткие ссылки.

5. Все данные файла, помимо двух типов данных, хранятся в соответствующей структуре inode. Назовите эти два типа данных!

6. Создайте символьную ссылку на файл summer.txt с именем slsummer.txt.

7. Найдите все файлы с идентификатором структуры inode, равным 2. Какой вывод вы можете сделать на основе полученной информации?

8. Исследуйте директории /etc/init.d/ /etc/rc.d/ /etc/rc3.d/ . обнаружили ли вы ссылки на файлы в них?

9. Выведите список файлов директории /lib с помощью команды ls -l.

10. Используйте утилиту find для поиска в вашей домашней директории обычных файлов, на которые не установлено (!) ни одной жесткой ссылки.

Корректная процедура выполнения практического задания: ссылки на файлы

1. Создайте два файла с именами winter.txt и summer.txt, поместите какие-либо текстовые данные в них.

2. Создайте жесткую ссылку на файл winter.txt с именем hlwinter.txt.

3. Выведите информацию об идентификаторах структур inode, соответствующих этим трем файлам, жесткие ссылки должны использовать структуры inode файлов, на которые они ссылаются.

4. Используйте утилиту find для вывода информации о файлах, на которые установлены жесткие ссылки.

5. Все данные файла, помимо двух типов данных, хранятся в соответствующей структуре inode. Назовите эти два типа данных!

Имя файла, которое хранится в файле директории и данные файла, которые хранятся где-либо на диске.

6. Создайте символьную ссылку на файл summer.txt с именем slsummer.txt.

7. Найдите все файлы с идентификатором структуры inode, равным 2. Какой вывод вы можете сделать на основе полученной информации?

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

8. Исследуйте директории /etc/init.d/ /etc/rc.d/ /etc/rc3.d/ . обнаружили ли вы ссылки на файлы в них?

9. Выведите список файлов директории /lib с помощью команды ls -l.

10. Используйте утилиту find для поиска в вашей домашней директории обычных файлов, на которые не установлено (!) ни одной жесткой ссылки.

Существует два типа ссылок, которые вы можете создать в Linux:

  • Жесткие ссылки
  • Символические ссылки

Символическая ссылка очень похожа на ярлык на рабочем столе в Windows. Символическая ссылка просто указывает на местоположение файла.

Удаление символической ссылки не влияет на физический файл, на который указывает ссылка.

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

Представь, что ты родился с именем Роберт. Другие люди могут знать вас как Робби, Боб, Бобби или Роб. Каждый человек будет говорить о том же человеке.

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

Зачем использовать жесткие ссылки?

Жесткие ссылки обеспечивают эффективный способ организации файлов. Самый простой способ описать это со старым эпизодом Улицы Сезам.

Берт сказал Эрни убрать все свои вещи, и поэтому Эрни приступил к выполнению своей задачи. Прежде всего он решил убрать все красные вещи. «Пожарная машина красная». Итак, Эрни убирает пожарную машину.

Далее Эрни решает убрать все игрушки на колесиках. Пожарная машина имеет колеса. Итак, Эрни убрал пожарную машину.

Само собой разумеется, Берт приходит домой, чтобы найти точно такой же беспорядок, как и раньше, но Эрни убирал пожарную машину с полдюжины раз.

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

  • Фотографии красных вещей
  • Фотографии транспортных средств
  • Фотографии экстренных служб

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

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

Жесткая ссылка не занимает места вообще. Таким образом, вы можете хранить одно и то же видео в разных категориях (например, по годам, жанрам, актерам, режиссерам), не уменьшая места на диске.

Как создать жесткую ссылку

Вы можете создать жесткую ссылку, используя следующий синтаксис:

Например, на изображении выше у нас есть папка с музыкой Алисы Купер, которая называется Trash, по пути/home/gary/Music/Alice Cooper/Trash. В этой папке 10 песен, одна из которых классическая Poison.

Это хороший способ организовать музыку.

Как определить разницу между жесткой связью и символической связью

Вы можете определить, имеет ли файл жесткую ссылку, с помощью команды ls:

Стандартный файл без ссылок будет выглядеть следующим образом

Если бы это была жесткая ссылка, результат выглядел бы следующим образом:

Обратите внимание, что в столбце количества ссылок отображается 2. Каждый раз, когда создается жесткая ссылка, это число будет увеличиваться.

Символическая ссылка будет выглядеть следующим образом:

Вы можете ясно видеть, что один файл указывает на другой.

Как найти все жесткие ссылки на файл

Все файлы в вашей системе Linux содержат номер инода, который однозначно идентифицирует файл. Файл и его жесткая ссылка будут содержать один и тот же индекс.

Чтобы увидеть номер индекса для файла, введите следующую команду:

Вывод для одного файла будет следующим:

Чтобы найти жесткие ссылки на файл, вам просто нужно выполнить поиск файлов по всем файлам с одинаковым индексом (т. Е. 1234567).

Favorite

Добавить в избранное

Главное меню » Операционная система Linux » Все, что вам нужно знать о жесткой ссылке в Linux

(1 оценок, среднее: 5,00 из 5)

Все, что вам нужно знать о жесткой ссылке в Linux

И зучите концепцию жестких ссылок в Linux и ее связь с inode в этой статье.

Прежде чем вы увидите жесткие ссылки, мы советуем вам узнать об inode в Linux. Файловая система Linux имеет два основных компонента: пул блоков данных, в которых хранятся данные, и система баз данных для управления этим пулом данных. Индекс подобен индексу для этой системы баз данных.

Что такое жесткая ссылка в Linux?

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

Мы собираемся объяснить это вам с правильными диаграммами. Давайте возьмем эту структуру каталогов, например:

Все, что вам нужно знать о жесткой ссылке в Linux. Представление файловой системы

Корневой каталог содержит каталоги dir_1 и dir_2. Каталог dir_1 содержит файлы file_1 и file_2, тогда как dir_2 содержит файл file_3 и жесткую ссылку на файл 2.

Давайте посмотрим, как все выглядит в файловой системе. Все изобразительное. В действительности в корневом каталоге будет тысячи файлов. Здесь мы предполагаем, что он имеет только две директории.

Все, что вам нужно знать о жесткой ссылке в Linux. Файловая система INODE в Linux

Помните структуру каталогов Linux? Вы начинаете с рута (/). Корневой каталог всегда имеет индекс 2.

Если вам нужен доступ к файлу 3, абсолютный путь будет /dir_2/file_3. Здесь вы можете прочитать это следующим образом: вы начинаете с inode 2 (root всегда inode 2) и следует за стрелкой к его блоку данных. Этот блок данных содержит информацию об inode dir_2 (inod 27 в нашем примере).

Читать Узнать дисковое пространство, используемое конкретным пользователем Linux

Обратите внимание, что все файлы имеют количество ссылок 1, кроме file_2? Если файл имеет количество ссылок больше 1, это означает, что существуют жесткие ссылки «на этот файл». Поскольку жесткие ссылки указывают на тот же inode (в нашем примере 17), что и целевой файл, вы получаете 2 списка каталогов для 17 (в блоке данных dir_1 и dir_2).

Как создать жесткие ссылки в Linux

Вы можете использовать следующую команду для создания жесткой ссылки:

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

Если вы используете команду ls -li (опция -i показывает номер индекса), вы увидите, что количество ссылок равно 2. Число ссылок находится после поля разрешения файла.

У обоих одинаковый номер индекса 134195, очевидно.

Что нужно помнить о жестких ссылках

Теперь, когда у вас есть хорошее представление о жестких ссылках в Linux, давайте пойдем дальше.

Удаление целевого файла не приведет к удалению его данных, если у него есть жесткая ссылка

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

Удаление файлов в Linux в основном не связывает. Предположим, вы удалили file_1 с помощью команды rm. Ядро Linux обнаружит , что file_2 соответствует INode 16. Это удалит file_2 запись из списка dir_1 и уменьшить inode 16 посчитает ссылку на 1. Теперь у inode 16 счетчик ссылок равен 0, ядро знает, что нет ссылок на этот inode, поэтому можно безопасно удалить inode и удалить связанный с ним блок данных.

Теперь скажите, что вы удалите file_2. Ядро удалит файл file_2 из списка dir_1 и перейдет в индекс 17. Это уменьшит количество ссылок в узле 17, уменьшив его до 1. Так как число ссылок не равно нулю, ядро не удалит индекс или данные, связанные с ним. И, следовательно, если вы получаете доступ к жесткой ссылке, вы все равно можете получить доступ к данным, даже если исходный файл был удален.

Читать Концепции системного администрирования Linux с необходимыми навыками

Вы не должны создавать жесткую ссылку на каталог

Вы можете создать мягкую ссылку на каталог, но при попытке создать жесткую ссылку на каталог вы увидите такую ошибку:

Почему жесткие ссылки не разрешены для каталога? Это потому, что использование жестких ссылок на каталог могут сломать файловую систему. Теоретически вы можете создать жесткую ссылку на каталоги, используя опцию -d или -F. Но большинство дистрибутивов Linux этого не допустят, даже если вы являетесь пользователем root.

Практически невозможно различить жесткие ссылки и исходный файл.

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

Они имеют идентичные атрибуты, но вы можете догадаться, какая ссылка основана на имени в приведенном выше примере, но что, если имя не было очевидным? Как бы вы узнали, если бы их имена были target_1 и target_2?

Бонусный совет: как найти все жесткие ссылки на данный файл

Если вы видите, что файл имеет более одного числа ссылок, вам могут быть интересны другие жесткие ссылки, связанные с ним.

Получив номер индекса, вы можете увидеть все ссылки, связанные с ним, с помощью команды find.

Трудно ли было понять жесткие ссылки?

Мы надеемся, что это не было слишком «сложно», и вы лучше понимаете концепцию жесткой связи в Linux. Если у вас есть сомнения или предложения по этой теме, пожалуйста, оставьте комментарий ниже.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: