Shell
如何找到損壞的符號連結
有沒有辦法找到所有不指向的符號連結?
find ./ -type l
會給我所有的符號連結,但不區分去某處的連結和不去的連結。
我目前正在做:
find ./ -type l -exec file {} \; | grep broken
但我想知道存在哪些替代解決方案。
我強烈建議不要用於
find -L
該任務(請參閱下面的解釋)。以下是執行此操作的其他一些方法:
- 如果您想使用“純
find
”方法,並假設 GNU 實現find
,它應該看起來像這樣:find . -xtype l
(**
xtype
**是在取消引用的連結上執行的測試)
- 可移植(雖然效率較低),您還可以
test -e
從find
命令中執行: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的solo
find -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
命令從一些看起來無害的目錄中查找並刪除損壞的符號連結,您甚至可能會破壞您的系統……