Как найти весь hardlinks в папке?

У меня есть два внешних диска, который имеет те же файлы. Каждый шифруется, другой не. Зашифрованный имеет намного меньше пространства, оставленного, чем не зашифрованный, я теперь предполагаю, что это из-за hardlinks на не зашифрованных дисках.

Таким образом, я хотел бы проверить, если существуют какие-либо hardlinked файлы, которые могли бы быть удвоены на зашифрованном диске. Как я могу определить hardlink?

Если у Вас есть какие-либо другие идеи, какова причина проблемы свободного пространства могла быть, I'am, открытый для идей. Действительно ли возможно, что файлам нужно больше пространства из-за шифрования?

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

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
9
ответ дан 2 December 2019 в 01:25

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

Ответы @ 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 ...)

  • Различный размер раздела, который вызывает различия в служебных данных (метаданных).

  • Различные размеры секторов на диске (может быть?)

5
ответ дан 2 December 2019 в 01:25

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

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

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

4
ответ дан 2 December 2019 в 01:25

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

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

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

3
ответ дан 2 December 2019 в 01:25

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

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