Как найти все жесткие ссылки (hard link) в каталоге в Linux

Joined
Aug 17, 2016
Messages
1,788
Reaction score
826
У меня есть файл с именем /etc/passwd i , и я хотел бы найти все жесткие ссылки на этот файл в каталоге. Как узнать все остальные жесткие ссылки в каталоге /etc/passwd in/backups/ ? Как найти все жесткие ссылки на данный файл с помощью командной строки Linux или Unix?

Вы можете использовать команду find в Linux, Apple MacOS, FreeBSD и других операционных системах, чтобы узнать все жесткие ссылки.

Как найти все жесткие ссылки на предоставленный файл
Жесткая ссылка — это не что иное, как конкретное местоположение физических данных. Вы даете разные имена, относящиеся к одному и тому же файлу. Файл относится к тому же inode, что и имя. Жесткие ссылки на файл foo можно создать следующим образом:

Code:
$ ln foo bar
$ ln foo dir2/foobar
В приведенном выше примере bar и foobar являются другими именами файла foo. Lля поиска всех жестких ссылок для файла foo в текущем каталоге cинтаксис будет выглядеть следующим образом:

Code:
find /dir/to/search/ -samefile /path/to/file/name
## To find out all hard links to foo, use this command:
find / -samefile foo
find / -xdev -samefile foo

Примеры
Если есть файл с именем /etc/passwd и вам нужно получить все жесткие ссылки на него, которые существуют в каталоге /backups/ , запустите:
Code:
$ find /backups/ -samefile /etc/passwd
Примеры возможных выводов данных:

Code:
/backups/hourly.0/etc/passwd
/backups/hourly.4/etc/passwd
/backups/hourly.3/etc/passwd
/backups/daily.0/etc/passwd
/backups/hourly.1/etc/passwd
/backups/hourly.2/etc/passwd
Если вы не хотите спускать каталоги на другие файловые системы, смонтированные однажды, попробуйте ввести:
Code:
$ find /backups/ -xdev -samefile /etc/passwd

Найдите и удаляйте все жесткие ссылки на файл с именем foo в /tmp/ директории
Введите следующую команду:
Code:
$ find /tmp/ -xdev -samefile foo -print0 | xargs -I {} -0 rm -v {}
Примеры возможных выводов данных:

Code:
removed '/tmp/dir2/foobar'
removed '/tmp/foo'
removed '/tmp/bar'


Справка, параметр -samefile не поддерживается моей командой find
Найдите номер файлов inode, для этого введите:
Code:
$ ls -li fileNameHere
$ ls -li /tmp/demo.txt
Примеры возможных выводов данных:
Code:
4065089 -rw-r--r-- 3 vivek vivek 8 Feb 26 02:19 /tmp/demo.txt

Первый столбец вышеприведенного вывода отображает индекс inode # 4065089 . Теперь альтернативный синтаксис выглядит следующим образом для поиска всех жестких ссылок (hard link) для файла с именем /tmp/demo.txt , используя inode # 4065089 :

Code:
$ find /tmp/ -inum 4065089
$ find /tmp/ -xdev -inum 4065089
Примеры возможных выводов данных:

Code:
/tmp/demo.txt
/tmp/dir2/file2.txt
/tmp/file1.txt
Чтобы найти и удалить все жесткие ссылки (hard link) на файл с номером inode # 4065089 , запустите:

Code:
$ find /tmp/ -xdev -inum 4065089 | xargs rm -v
$ find /tmp/ -xdev -inum 4065089 -print0 | xargs -I {} -0 rm -v {}

Вот пример моей сессии:
621afccbb702beb637752.png
 
Top