Listar todos os arquivos com o mesmo número de inode?

Listar todos os arquivos com o mesmo número de inode?

Digamos que quando faço isso ls -lidentro de um diretório, recebo o seguinte:

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

Como mostra a saída, o arquivodiversão.txttem6links físicos; e o número do inode é12353538.

Como encontro todos os links físicos do arquivo, ou seja, arquivos com o mesmo número de inode?

Responder1

A premissa básica é usar:

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

Em sistemas com findmntvocê pode derivar o ponto de montagem assim:

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

É importante não pesquisar /- a menos que o arquivo de destino esteja nesse sistema de arquivos - porque os números de inode são reutilizados em cada sistema de arquivos montado.

Responder2

Se você já possui o número do inode, você pode usar a opção find -inum:

find /mount/point -xdev -inum 12353538

(algumas findimplementações também suportam -mountcomo equivalente, -xdevembora apenas -xdevseja padrão).

Responder3

ffinddeO kit de detetivepode encontrar todos os nomes de arquivos de um inode, incluindo nomes de arquivos excluídos.

Por exemplo:

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

rendimentos

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

As entradas com um asterisco anterior são nomes de arquivos anteriores que não existem mais (porque o arquivo foi renomeado ou excluído).


Eu uso $(stat --format=%i ~/just_a_test)para obter o inode do arquivo.

Para obter a partição do nome do arquivo programaticamente ( /dev/sda3no exemplo anterior), você pode usardf:

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

Responder4

Com agradecimentos às respostas anteriores.

Observe que o statbinário pode não apenas fornecer o inode, mas também o ponto de montagem do dispositivo correspondente. O trecho abaixo usa isso para resolver o caso de uso 'normal':

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

e executando:

> 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: cuidado com exitvs returndependendo de como você usa isso!

informação relacionada