- Как найти все жесткие ссылки в папке?
- 12 ответов
- Поиск жестких ссылок
- Другие причины, по которым используется различный объем дискового пространства
- Поиск жестких ссылок
- Другие причины, по которым используется различный объем дискового пространства
- How to find all hard links to a given file? [duplicate]
- 1 Answer 1
- Documentation
- Differences between find and ls
Как найти все жесткие ссылки в папке?
Вы можете получить меню GRUB, нажав клавишу Shift во время загрузки вашей системы.
12 ответов
Это покажет все обычные файлы с несколькими ссылками (именем). Он не скажет вам, какие имена связаны с одним и тем же файлом, для чего вы можете использовать -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
+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, что важно при поиске в корневом разделе /, и есть другие смонтированные разделы.
$ 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
Другие причины, по которым используется различный объем дискового пространства
Если связанное в том же дереве каталогов, вы найдете их напрямую.
В противном случае вы можете искать во всей файловой системе из точку монтирования, но только в пределах той же файловой системы, использующей -xdev, что важно при поиске корневого раздела / и других монтируемых разделов.
$ sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt
Теоретически жесткие ссылки должны быть неотличимы от обычных файлов (это своего рода точка). Если «x» является жесткой ссылкой на «y», тогда «y» также является жесткой ссылкой на «x». При этом второй столбец ls -l сообщает вам, сколько ссылок есть в данном файле. Если это число больше 1, файл имеет или имеет жесткую ссылку где-то. Возможно, это не работает для каталогов, но я не знаю, почему. Сначала я сказал, что каждый файл в каталоге имеет ссылку на этот каталог, но я был не прав: я нашел каталог с 10 файлами, чей «счетчик ссылок» был только 2.
Как только вы нашли трудный link, вы можете сделать ls -i, чтобы увидеть его inode, а затем использовать опцию inode find для поиска других файлов с тем же inode (тем самым делая их жесткими ссылками друг на друга). Обязательно ограничьте find определенным устройством, в противном случае вы можете получить ложные результаты.
Чтобы найти все жесткие ссылки сразу, find вытащить inodes для всех файлов на устройстве, а затем используйте такие вещи, как sort и uniq, чтобы найти дубликаты.
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
Технически, жесткая ссылка — это просто ассоциация имени файла с некоторыми данными. Каждый нормальный файл (т. Е. Не символические ссылки, устройства и т. Д.) Является жесткой линией. Поэтому я жаловался, что » Если это число больше 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. Замените свое собственное имя пользователя.)
На самом деле, регулярный 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, чтобы найти дубликаты.
Вы можете сделать что-то вроде этого:
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 данных раздел
$ 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
Другие причины, по которым используется различный объем дискового пространства
Если связанное в том же дереве каталогов, вы найдете их напрямую.
В противном случае вы можете искать во всей файловой системе из точку монтирования, но только в пределах той же файловой системы, использующей -xdev, что важно при поиске корневого раздела / и других монтируемых разделов. $ sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt
How to find all hard links to a given file? [duplicate]
How can we find all hard links to a given file? I.e., find all other hard links to the same file, given a hard link? Does filesystem keep track of the hard links to a file? The inode of a file only stores the number of hard links to the file, but not the hard links, right?
1 Answer 1
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
-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.