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

If the given file is called /path/to/file and you want to find all hard links to it that exist under the current directory, then use:

find . -samefile /path/to/file 

The above was tested on GNU find. Although -samefile is not POSIX, it is also supported by Mac OSX find and FreeBSD find.

Documentation

From GNU man find:

-samefile name
       File refers to the same inode as name. When -L is in effect, this can include symbolic links.

Differences between find and ls

ls -l lists the number of hard links to a file or directory. For directories, this number is larger than the number of results shown by find . -samefile. The reason for this is explained in the GNU find manual:

A directory normally has at least two hard links: the entry named in
its parent directory, and the . entry inside of the directory. If a
directory has subdirectories, each of those also has a hard link
called .. to its parent directory.

The . and .. directory entries are not normally searched unless they
are mentioned on the find command line.

In sum, ls -l counts the . and .. directories as separate hard links but find . -samefile does not.

Finding symlinks is easy:

% find . -type l

Finding hard links is tricky, because if a subdirectory of the directory in question also has subdirectories then those increase the hard link count. That’s how subdirectories are linked to their parents in UNIX (it’s the .. entry in each subdirectory).

If you only want to find linked files (and not directories), this will work:

% find . -type f ! -links 1

This works because a file that does have hard links will have a link count > 1, and unlinked file has a link count == 1, hence this command looks for all files whose link count <> 1

Alternatively, on newer versions of find you could use:

% find . -type f -links +1

This works for the same reason as above; however, newer versions of find can take +n or -n instead of just a number. This is equivalent to testing for greater than n or less than n, respectively.

Как найти все жесткие ссылки (hard link) в каталоге в LinuxУ меня есть файл с именем /etc/passwd i , и я хотел бы найти все жесткие ссылки на этот файл в каталоге. Как узнать все остальные жесткие ссылки в каталоге /etc/passwd in/backups/ ? Как найти все жесткие ссылки на данный файл с помощью командной строки Linux или Unix?

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

Как найти все жесткие ссылки на предоставленный файл

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

$ ln foo bar
$ ln foo dir2/foobar

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

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/ , запустите:

$ find /backups/ -samefile /etc/passwd

Примеры возможных выводов данных:

/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

Если вы не хотите спускать каталоги на другие файловые системы, смонтированные однажды, попробуйте ввести:

$ find /backups/ -xdev -samefile /etc/passwd

Найдите и удаляйте все жесткие ссылки на файл с именем foo в /tmp/ директории

Введите следующую команду:

$ find /tmp/ -xdev -samefile foo -print0 | xargs -I {} -0 rm -v {}

Примеры возможных выводов данных:

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

Справка, параметр -samefile не поддерживается моей командой find

Найдите номер файлов inode, для этого введите:

$ ls -li fileNameHere
$ ls -li /tmp/demo.txt

Примеры возможных выводов данных:

4065089 -rw-r--r-- 3 vivek vivek 8 Feb 26 02:19 /tmp/demo.txt

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

$ find /tmp/ -inum 4065089
$ find /tmp/ -xdev -inum 4065089

Примеры возможных выводов данных:

/tmp/demo.txt
/tmp/dir2/file2.txt
/tmp/file1.txt

Чтобы найти и удалить все жесткие ссылки (hard link) на файл с номером inode # 4065089 , запустите:

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

Вот пример моей сессии:

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

Рисунок 01: Как найти все жесткие ссылки (hard link) на заданное имя файла.

Перевод: Анна Давыдова
Источник: cyberciti.biz

Это интересно:

  • Установка и настройка Apache, PHP, MySQL, phpMyAdmin на Linux (LAMP)
  • Установка и настройка сервера Apache, PHP, MySQL, phpMyAdmin на Windows 10
  • Установка Adobe Photoshop CS6 на Linux (очень простой способ)


Уменя есть файл с именем/etc/passwd, и я хотел бы найти все жесткие ссылки на этот файл в каталоге. Как узнать все жесткие ссылки в каталоге /etc/passwd  и /backups/? Как найти все жесткие ссылки на данный файл с помощью командной строки Linux или Unix?

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

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

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

$ ln foo bar
$ ln foo dir2/foobar

В приведенном выше примере bar и foobar становятся другим именем файла foo. Синтаксис следующий, чтобы найти все жесткие ссылки для файла foo в текущем каталоге:

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/passswd и вам нужно получить все жесткие ссылки, которые существуют в каталоге/backups/, запустите:

$ find/backups/ -samefile/etc/passwd

Пример результата:

/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

Если вы не хотите искать каталоги на других файловых системах, таких как смонтированные, попробуйте:

$ find/backups/ -xdev -samefile/etc/passwd

НАЙТИ И УДАЛИТЬ ВСЕ ЖЕСТКИЕ ССЫЛКИ НА ФАЙЛ С ИМЕНЕМ FOO в /TMP/

Введите следующую команду:

$ find /tmp/ -xdev -samefile foo -print0 | xargs -I {} -0 rm -v {}

Пример результата:

 Удалено '/tmp/dir2/foobar'
 Удалено '/tmp/foo'
 Удалено '/tmp/bar'

Справка, параметр -samefile не поддерживается командой find

Определить номер inode файла, введите:

$ ls -li fileNameHere
$ ls -li /tmp/demo.txt

Пример резульатат:

  4065089 -rw-r-r-- 3 root root 8 февраля 26 02:19/tmp/demo.txt

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

$ find /tmp/-inum 4065089
$ find /tmp/-xdev -inum 4065089

Пример  результата:

/tmp/demo.txt
/tmp/dir2/file2.txt
/tmp/file1.txt

Чтобы найти и удалить все жесткие ссылки на файл по номеру inode # 4065089, запустите:

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

Вот мой пример:

поиск и удаление жестких ссылок

Круглосуточная поддержка Linux/Unix серверов, [email protected]

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

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

задан
2 November 2017 в 17:13

поделиться

12 ответов

$ find -type f -links +1

Это покажет все обычные файлы с несколькими ссылками (именем). Он не скажет вам, какие имена связаны с одним и тем же файлом, для чего вы можете использовать -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
22 May 2018 в 16:52

поделиться

$ find -type f -links +1

Это покажет все обычные файлы с несколькими ссылками (именем). Он не скажет вам, какие имена связаны с одним и тем же файлом, для чего вы можете использовать -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
18 July 2018 в 04:03

поделиться

$ find -type f -links +1

Это покажет все обычные файлы с несколькими ссылками (именем). Он не скажет вам, какие имена связаны с одним и тем же файлом, для чего вы можете использовать -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
24 July 2018 в 17:59

поделиться

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

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

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

$ sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt

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

$ sudo find . -xdev -type f -links +1 -ls | sort -n
  5242881    648 -rw-rw-r--   2 olle     nio        657936 jun 30  2015 ./like-this.png
  5242882    940 -rw-rw-r--   2 olle     nio        957688 jun 30  2015 ./from-here.png
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./img_4810.jpg
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./mid-sommer-night_4810.jpg

$ find /media/multimed-2/ -samefile ./like-this.png
/media/multimed-2/Photos/2015/06/30/like-this.png
/media/multimed-2/Bilder/kartor/like-this.png

$ find /media/multimed-2/ -samefile ./from-here.png
/media/multimed-2/Photos/2015/06/30/from-here.png
/media/multimed-2/Bilder/kartor/from-here.png

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

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

Если связанное {match is / matches are} в том же дереве каталогов, вы найдете их напрямую.

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

$ sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt

ответ дан sudodus
22 May 2018 в 16:52

поделиться

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

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

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

ответ дан barrycarter
22 May 2018 в 16:52

поделиться

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

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

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

ответ дан Jos
22 May 2018 в 16:52

поделиться

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

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

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

ответ дан barrycarter
18 July 2018 в 04:03

поделиться

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

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

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

ответ дан Jos
18 July 2018 в 04:03

поделиться

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

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

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

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

$ sudo find . -xdev -type f -links +1 -ls | sort -n
5242881 648 -rw-rw-r-- 2 olle nio 657936 jun 30 2015 ./like-this.png
5242882 940 -rw-rw-r-- 2 olle nio 957688 jun 30 2015 ./from-here.png
14843905 1620 -rw-r--r-- 2 olle nio 1652803 jun 30 2015 ./img_4810.jpg
14843905 1620 -rw-r--r-- 2 olle nio 1652803 jun 30 2015 ./mid-sommer-night_4810.jpg

$ find /media/multimed-2/ -samefile ./like-this.png
/media/multimed-2/Photos/2015/06/30/like-this.png
/media/multimed-2/Bilder/kartor/like-this.png

$ find /media/multimed-2/ -samefile ./from-here.png
/media/multimed-2/Photos/2015/06/30/from-here.png
/media/multimed-2/Bilder/kartor/from-here.png

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

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

Если связанное {match is / matches are} в том же дереве каталогов, вы найдете их напрямую.

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

ответ дан sudodus
18 July 2018 в 04:03

поделиться

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

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

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

ответ дан barrycarter
24 July 2018 в 17:59

поделиться

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

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

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

ответ дан Jos
24 July 2018 в 17:59

поделиться

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

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

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

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

$ sudo find . -xdev -type f -links +1 -ls | sort -n
5242881 648 -rw-rw-r-- 2 olle nio 657936 jun 30 2015 ./like-this.png
5242882 940 -rw-rw-r-- 2 olle nio 957688 jun 30 2015 ./from-here.png
14843905 1620 -rw-r--r-- 2 olle nio 1652803 jun 30 2015 ./img_4810.jpg
14843905 1620 -rw-r--r-- 2 olle nio 1652803 jun 30 2015 ./mid-sommer-night_4810.jpg

$ find /media/multimed-2/ -samefile ./like-this.png
/media/multimed-2/Photos/2015/06/30/like-this.png
/media/multimed-2/Bilder/kartor/like-this.png

$ find /media/multimed-2/ -samefile ./from-here.png
/media/multimed-2/Photos/2015/06/30/from-here.png
/media/multimed-2/Bilder/kartor/from-here.png

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

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

Если связанное {match is / matches are} в том же дереве каталогов, вы найдете их напрямую.

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

ответ дан sudodus
24 July 2018 в 17:59

поделиться

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

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

Понравилась статья? Поделить с друзьями:
  • Как найти биссектрису угла видеоурок
  • Как найти полную мощность всей цепи
  • Как найти память в биосе asus
  • Как найти своих предков в германии
  • Нашел карту как узнать баланс чужой карты