Files

徹底找到通向文件/目錄的所有連結(硬連結和符號連結,以及它們的任何組合)

  • January 27, 2019

我想只使用“基本”命令(以獲得最大的可移植性)(即,可以在 AIX / Linux / 等上執行的東西,而不僅僅是使用最近的細節^^)來查找所有文件(符號連結、硬連結和它們的組合)指向特定的文件/目錄。

注意不要急於回答find / -ls | grep ....:它會錯過很多案例。請參閱下面的連結,混合硬連結、符號連結、相對路徑和絕對路徑(還可以使用符號連結“././././.”的可能性)

IE

  • 硬連結和符號連結可以“嵌套”,ad-inifinitum …
  • 一些符號連結可能帶有完整路徑,其他符號連結可能帶有相對路徑,
  • 這些路徑(相對或絕對)可能非常複雜(例如: /tmp/././../etc/file )
  • 一個符號連結可能導致一個文件,該文件硬連結到另一個文件,這是一個符號連結到第三個,最終$$ after some more iteration $$到最終目的地……

最後,我“只是”需要找到一種方法來知道任何文件/連結的“最終目的地”是什麼(即,最終將訪問哪個 inode?)。但這真的很難(除非一些神奇的功能會告訴我“最終目標 inode 是:……”。這就是我需要的!)

我以為我可以簡單地使用 find 的 ‘-H’ 或 ‘-L’ 選項,但是(我可能很笨……)它沒有用……但是。

歡迎任何資訊(但請使用 find/ls/etc,而不是一些“僅在 linux 上可用的好實用程序”)

嘗試創建一些指向“/tmp/A”目錄的不同連結,並找到一種方法來查找並列出它們:

mkdir /tmp/A    /tmp/B
ln -s /tmp/A/   /tmp/B/D  #absolute symlink, with a training "/"
ln -s ../A      /tmp/B/E     #relative symlink
ln -s /tmp/A/.  /home/F  #absolute symlink, with a trailing "/."
ln -s ../tmp/A/./.  /var/L  #let's get craaaaaaazy! symlinks are "fun"...
ln    /tmp/B/D  /etc/G    #Hard-link to the symlink file /tmp/B/D, which itself symlink to /tmp/A/ witch ends up being the same as "/tmp/A" in most cases.
ln    /etc/G    /etc/G2   #and a duplicate of the previous one, just to be sure [so /etc/G, /etc/G2, and /tmp/B/D have same inode, but it's a different inode from the final destination... :(
ln -s etc/G /thatsenough   #symlink again, for further chaining

然後一些嘗試:

find -H / -ls   # show inodes of the links and symlinks, not of the "final" directory
find -L / -ls   # same thing (I do try that on an OLD AIX ...)
find -H / -inum 123456 -ls  #if /tmp/A/. has inode 123456. This lists *only* hardlinks to /tmp/A, ie will only print a subset (and /tmp/A have to be a file in that case)

我希望在其中一個呼叫中看到所有路徑前面的最終索引節點(123456)(我還向兩者添加了“-follow”),但我總是看到連結的索引節點,而不是“最終目的地”的索引節點"(即 /tmp/A)

我可以用什麼來找出我最終訪問的“最終 inode”?[作業系統管理它,但是一個“簡單”命令可以事先告訴我“通過那個文件,你將打開那個最終的 inode!”?]

ls有一個-L選項可以有效地追踪符號連結並顯示最終對象的權限、所有者、inode 等。[它通過做stat(target)而不是lstat(target)]來做到這一點。為獲得最佳結果,請以 root 或對相關掛載文件系統具有讀取權限的人身份執行。

因此,在您的情況下,請嘗試以下操作:

find / -exec ls -iLd {} | grep inodenum

$$ copied from my comment, per request of the OP. $$

這個問題沒有統一的答案。例如,通過在樹中連結幾個符號連結,我可以創建無限多可能的路徑來解析到同一個 inode。

您對完全可移植性的渴望也不太可能成功。例如,在 GNU、BSD、POSIX 和其他變體之間(當然在這些變體的版本之間),即使是“查找”也存在差異。

但你想要的可能類似於find / -samefile /absolute/path/to/file.

這在 GNU find >= 4.2.11 中可用。

引用自:https://unix.stackexchange.com/questions/99271