列出具有相同索引節點號的所有檔案?

列出具有相同索引節點號的所有檔案?

假設當我ls -li在目錄中執行操作時,我得到以下結果:

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

如輸出所示,文件樂趣.txt6硬連結;索引節點號碼是12353538

如何找到文件的所有硬連結(即具有相同 inode 號的文件)?

答案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"

重要的是不要搜尋/- 除非目標檔案位於該檔案系統上 - 因為 inode 號在每個安裝的檔案系統中都會重複使用。

答案2

如果您已經有了 inode 編號,則可以使用 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)取得檔案的索引節點。

若要以程式設計方式取得檔案名稱的分割區(/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:注意exitvsreturn取決於你如何使用它!

相關內容