У меня есть два внешних диска, который имеет те же файлы. Каждый шифруется, другой не. Зашифрованный имеет намного меньше пространства, оставленного, чем не зашифрованный, я теперь предполагаю, что это из-за hardlinks на не зашифрованных дисках.
Таким образом, я хотел бы проверить, если существуют какие-либо hardlinked файлы, которые могли бы быть удвоены на зашифрованном диске. Как я могу определить hardlink?
Если у Вас есть какие-либо другие идеи, какова причина проблемы свободного пространства могла быть, I'am, открытый для идей. Действительно ли возможно, что файлам нужно больше пространства из-за шифрования?
$ 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 хороши. Этот ответ является альтернативой, которая описывает некоторые результаты более подробно.
Если связанные {совпадают / совпадают} в одном и том же дереве каталогов, вы найдете их непосредственно.
В противном случае вы можете выполнять поиск во всей файловой системе из точки монтирования, но только в пределах одной и той же файловой системы, используя -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
, чтобы найти другие файлы с таким же индексом (таким образом делая их жесткими ссылками). друг другу). Обязательно ограничьте find
определенным устройством, иначе вы можете получить ложные результаты.
Чтобы найти все жесткие ссылки одновременно, сделайте find
выпуклыми inode для всех файлов на устройстве, а затем используйте такие вещи, как sort
и uniq
, чтобы найти дубликаты.
Вы можете сделать что-то вроде этого:
find . -type t -ls | grep -v " 1 username"
Это выведет список файлов в текущем каталоге и выполнит ls
над ним. Как сказал @barrycarter, жесткие ссылки неотличимы от реальных файлов, но в этом списке они будут отображаться как имеющие более одной ссылки. Используя grep -v
, вы отсеиваете файлы, имеющие только одну ссылку. (username
в команде grep означает, что grep выглядит в нужном месте для одиночного 1
. Замените на свое имя пользователя.)