Как найти все жесткие ссылки в папке?
У меня есть два внешних диска с одинаковыми файлами. Один зашифрован, другой нет. Зашифрованный имеет намного меньше места, чем незашифрованный, теперь я предполагаю, что это из-за жестких ссылок на незашифрованных дисках.
Поэтому я хотел бы проверить, есть ли какие-либо жестко связанные файлы, которые могут быть дублированы на зашифрованном диске. Как я могу определить жесткую ссылку?
Если у вас есть какие-либо идеи о том, что может быть причиной проблемы свободного пространства, я открыт для идей. Возможно ли, что файлы требуют больше места из-за шифрования?
4 ответа
$ 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 и @barrycarter хорошие. Этот ответ является альтернативой, которая описывает некоторые результаты более подробно.
Если связанные {match is/matchs} в одном и том же дереве каталогов, вы найдете их напрямую.
В противном случае вы можете выполнять поиск во всей файловой системе из точки монтирования, но только в пределах одной файловой системы, используя
-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
Другие причины, по которым используется другой объем дискового пространства
Различные файловые системы (ext4, NTFS, FAT32 ...)
Различный размер раздела, что вызывает различия в накладных расходах (метаданных).
Различный размер сектора на диске (может быть?)
Теоретически, жесткие ссылки должны быть неотличимы от обычных файлов (в этом вся суть). Если "x" является жесткой ссылкой на "y", то "y" также является жесткой ссылкой на "x". Как говорится, второй столбец ls -l
говорит, сколько ссылок на данный файл. Если это число больше 1, файл является или имеет жесткую ссылку где-то. Это может не работать для каталогов, но я не уверен, почему. Первоначально я сказал, что каждый файл в каталоге имеет ссылку на этот каталог, но я ошибся: я нашел каталог с 10 файлами, чей "счетчик ссылок" был только 2.
Как только вы нашли жесткую ссылку, вы можете сделать ls -i
чтобы увидеть его индекс, а затем использовать find
опция inode для поиска других файлов с таким же индексом (что делает их жесткими ссылками друг на друга). Обязательно ограничивай find
на конкретное устройство, в противном случае вы можете получить ложные результаты.
Чтобы найти все жесткие ссылки сразу, есть find
выкладывать inode для всех файлов на устройстве, а затем использовать такие вещи, как sort
а также uniq
найти дубликаты.
Вы могли бы сделать что-то вроде этого:
find . -type t -ls | grep -v " 1 username"
Это перечислит файлы в текущем каталоге и выполнит ls
в теме. Как сказал @barrycarter, жесткие ссылки неотличимы от реальных файлов, но в этом списке они будут отображаться как имеющие более одной ссылки. С помощью grep -v
Вы отсеяли файлы, которые имеют только одну ссылку. (The username
в команде grep, чтобы grep выглядел в нужном месте 1
, Заменить на свое имя пользователя.)