徹底找到通向文件/目錄的所有連結(硬連結和符號連結,以及它們的任何組合)
我想只使用“基本”命令(以獲得最大的可移植性)(即,可以在 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 中可用。