Вывести список всех файлов с одинаковым номером inode?

Вывести список всех файлов с одинаковым номером inode?

Допустим, когда я захожу ls -liв каталог, я получаю следующее:

12353538 -rw-r--r-- 6 me me 1650 2013-01-10 16:33 fun.txt

Как показывает вывод, файлвеселье.txtимеет6жесткие ссылки; и номер инода равен12353538.

Как найти все жесткие ссылки для файла, т.е. файлы с одинаковым номером инода?

решение1

Основная предпосылка заключается в использовании:

find /mount/point -mount -samefile /mount/point/your/file

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

file=/path/to/your/file
find "$(findmnt -o TARGET -cenT "$file")" -mount -samefile "$file"

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

решение2

Если у вас уже есть номер инода, вы можете использовать опцию find -inum:

find /mount/point -xdev -inum 12353538

(некоторые findреализации также поддерживают -mountкак эквивалент, -xdevхотя только -xdevявляется стандартом).

решение3

ffindотНабор детективаможет найти все имена файлов для inode, включая имена удаленных файлов.

Например:

sudo ffind -a /dev/sda3 $(stat --format=%i ~/just_a_test)

урожайность

* /home/me/empty_1
* /home/me/hard_link_to_empty1
/home/me/just_a_test
/home/me/hard_link_to_just_a_test

Записи, отмеченные звездочкой, представляют собой предыдущие имена файлов, которые больше не существуют (потому что файл был переименован или удален).


Я использую $(stat --format=%i ~/just_a_test)для получения inode файла.

Чтобы получить раздел имени файла программным способом ( /dev/sda3в предыдущем примере), можно использоватьdf:

file=~/just_a_test; sudo ffind -a $(df -P "$file" | awk 'END{print $1}') $(stat --format=%i "$file")

решение4

С благодарностью за предыдущие ответы.

Обратите внимание, что statдвоичный файл может предоставить не только inode, но и соответствующую точку монтирования устройства. Фрагмент ниже использует это для решения «обычного» варианта использования:

fn_hardlinks() {
  declare target; target="$1" && shift
  [ ! -e "$target" ] && \
    { echo "[error] invalid target: '$target'" 1>&2; exit 1; }
  stat '/' 2>/dev/null 1>&2 || \
    { echo "[error] no functioning 'stat' binary found'" 1>&2; exit 1; }
  declare mount; mount="$(stat -c '%m' "$target")"
  declare inode; inode="$(stat -c '%i' "$target")"
  [ "x${mount[-1]}" != "x/" ] && mount+="/"
  find "$mount" -xdev -inum "$inode" 2>/dev/null
}

alias hardlinks=fn_hardlinks

и работает:

> hardlinks ./resources/sphinx/gitinfo.py
/home/user/build/z-documentation/resources/sphinx/gitinfo.py
/home/user/build/sphinx-gitinfo/git/sphinx-gitinfo/gitinfo.py

PS: будьте осторожны с exitvs returnв зависимости от того, как вы это используете!

Связанный контент