18

Мне нужно найти все жестко связанные файлы в данной файловой системе. Например, получить список файлов, каждая строка содержит связанные пары или триплеты и т.д.

Я более или менее понимаю, как это сделать, нужно создать словарь с ключом inode для всех файлов / каталогов в файловой системе, исключив "." и ".." ссылки, а затем индоды с более чем одним именем являются жесткими ссылками ... Но я надеюсь, что, возможно, готовое решение существует, или кто-то уже написал такой сценарий.

3 ответа3

15
find . -type f -links +1 2>/dev/null

дает список всех файлов, которые имеют более одной ссылки, то есть файлов, на которые существует жесткая ссылка. Циклы по этому тогда относительно легки - хакерское решение, если у вас не так много файлов, было бы

for i in $(find . -type f -links +1 2>/dev/null); do find -samefile $i | awk '{printf "%s ", $1}'; printf "\n"; done | sort | uniq

Но я искренне надеюсь , что есть более эффективные решения, например, позволяя сначала find вызов номера для инодов , а затем с помощью опции find -inum «s , чтобы показать все файлы , связанные с этим инодом.

14

Вы можете запустить следующую команду:

find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'

найти все жестко связанные файлы.

Или версия @mbafford:

find / -type f -links +1 -printf '%i %n %p\n'
0

ИМХО, лучший способ - использовать следующую строку (наверняка вам нужно заменить /PATH/FOR/SEARCH/ на то, что вы хотите найти):

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n

это сканирует файловую систему только один раз, показывает индекс, количество жестких ссылок и путь к файлам с более чем одной жесткой ссылкой и сортирует их в соответствии с индексом.

если вас раздражают сообщения об ошибках для папок, которые вам запрещено читать, вы можете расширить строку до следующего:

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' 2> /dev/null | fgrep -f <(find . -xdev -printf '%i\n' 2> /dev/null | sort -n | uniq -d) | sort -n

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .