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

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

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

4
ответ дан 22 May 2018 в 16:52
  • 1
    This may not work for directories, but I'm not sure why. I initially said each file in a directory has a link to that directory, but I was wrong: I found a directory with 10 files whose "link count" was only 2. Родитель имеет ссылку на каталог, сам каталог имеет ., а в каждом дочернем каталоге есть ... – tkausl 2 November 2017 в 20:02
  • 2
    Технически, жесткая ссылка - это просто ассоциация имени файла с некоторыми данными. Каждый нормальный файл (т. Е. Не символические ссылки, устройства и т. Д.) Является жесткой линией. Поэтому я жаловался, что " Если это число больше 1, файл имеет или имеет где-то жесткую ссылку " не является довольно точным; Я бы предпочел, чтобы это говорило «... у файла есть еще одна hardlink где-нибудь». или что-то типа того. Однако это второстепенный момент. – David Z 3 November 2017 в 00:37
  • 3
    @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. Замените свое собственное имя пользователя.)

3
ответ дан 22 May 2018 в 16:52
  • 1
    На самом деле, регулярный ls -l показывает это тоже, а ls -l |perl -anle 'print $F[1]' является более общим решением (вы также можете использовать cut или что-то еще). Я рассматриваю этот столбец как «столбец, который все игнорируют». :) Я был удивлен, узнав, что некоторые пакеты / программное обеспечение создает жесткие ссылки - я думал, что мой диск был жестким, свободным, но, видимо, нет. – barrycarter 2 November 2017 в 17:48

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

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

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

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

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

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

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

3
ответ дан 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
5
ответ дан 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, чтобы найти дубликаты.

4
ответ дан 24 July 2018 в 17:59
  • 1
    This may not work for directories, but I'm not sure why. I initially said each file in a directory has a link to that directory, but I was wrong: I found a directory with 10 files whose "link count" was only 2. Родитель имеет ссылку на каталог, сам каталог имеет ., а в каждом дочернем каталоге есть ... – tkausl 2 November 2017 в 20:02
  • 2
    Технически, жесткая ссылка - это просто ассоциация имени файла с некоторыми данными. Каждый нормальный файл (т. Е. Не символические ссылки, устройства и т. Д.) Является жесткой линией. Поэтому я жаловался, что & quot; Если это число больше 1, файл имеет или имеет где-то жесткую ссылку " не является довольно точным; Я бы предпочел, чтобы это говорило «... у файла есть еще одна hardlink где-нибудь». или что-то типа того. Однако это второстепенный момент. – David Z 3 November 2017 в 00:37
  • 3
    @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. Замените свое собственное имя пользователя.)

3
ответ дан 24 July 2018 в 17:59
  • 1
    На самом деле, регулярный ls -l показывает это тоже, а ls -l |perl -anle 'print $F[1]' является более общим решением (вы также можете использовать cut или что-то еще). Я рассматриваю этот столбец как «столбец, который все игнорируют». :) Я был удивлен, узнав, что некоторые пакеты / программное обеспечение создает жесткие ссылки - я думал, что мой диск был жестким, свободным, но, видимо, нет. – barrycarter 2 November 2017 в 17:48

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

Ответы @ 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
5
ответ дан 24 July 2018 в 17:59

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

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