Shell

如何找到損壞的符號連結

  • March 18, 2022

有沒有辦法找到所有不指向的符號連結?

find ./ -type l

會給我所有的符號連結,但不區分去某處的連結和不去的連結。

我目前正在做:

find ./ -type l -exec file {} \; | grep broken

但我想知道存在哪些替代解決方案。

我強烈建議不要用於find -L 該任務(請參閱下面的解釋)。以下是執行此操作的其他一些方法:

  • 如果您想使用“純find”方法,並假設 GNU 實現find,它應該看起來像這樣:
find . -xtype l

(**xtype**是在取消引用的連結上執行的測試)

  • 可移植(雖然效率較低),您還可以test -efind命令中執行:
find . -type l ! -exec test -e {} \; -print
  • 甚至一些grep技巧可能比 更好(即更安全find -L,但並不完全像問題中提出的那樣(在整個輸出行中,包括文件名):
find . -type l -exec sh -c 'file -b "$1" | grep -q "^broken"' sh {} \; -print

來自commandlinefu的solofind -L引用的技巧看起來不錯而且很hacky,但它有一個非常危險的陷阱:遵循所有符號連結。考慮包含以下內容的目錄:

$ ls -l
total 0
lrwxrwxrwx 1 michal users  6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/

如果您find -L . -type l在該目錄中執行,則所有內容都/usr/share/將被搜尋(這可能需要很長時間)1。對於find“對傳對外連結接免疫”的命令,不要使用-L.


1這可能看起來像一個小不便(該命令將“只是”需要很長時間才能遍歷所有/usr/share) - 但可能會產生更嚴重的後果。例如,考慮 chroot 環境:它們可以存在於主文件系統的某個子目錄中,並包含指向絕對位置的符號連結。對於“外部”系統,這些連結似乎已被破壞,因為它們僅在您進入 chroot 後才指向正確的位置。我還記得一些引導載入程序使用的符號連結/boot僅在初始引導階段才有意義,此時引導分區被掛載為/.

因此,如果您使用find -L命令從一些看起來無害的目錄中查找並刪除損壞的符號連結,您甚至可能會破壞您的系統……

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