
有沒有辦法找到所有不指向的符號連結?
find ./ -type l
會給我所有的符號鏈接,但不區分去某處的鏈接和不去某處的鏈接。
我目前正在做:
find ./ -type l -exec file {} \; | grep broken
但我想知道有哪些替代解決方案。
答案1
我強烈建議不是用於find -L
任務(請參閱下面的解釋)。以下是執行此操作的一些其他方法:
如果你想使用「純粹
find
」的方法,並假設 的 GNU 實現find
,它應該看起來像這樣:find . -xtype l
(
xtype
是在取消引用的連結上執行的測試)可移植(儘管效率較低),您也可以
test -e
從find
命令中執行:find . -type l ! -exec test -e {} \; -print
甚至一些
grep
技巧可能會更好(即,更安全) 比find -L
,但不完全像問題中提出的那樣(它在整個輸出行中進行 grep,包括檔案名稱):find . -type l -exec sh -c 'file -b "$1" | grep -q "^broken"' sh {} \; -print
find -L
引用的技巧獨奏從命令列fu看起來不錯又老套,但它有一個非常危險的陷阱: 遵循所有符號連結。考慮包含以下內容的目錄:
$ 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
命令查找然後從一些看似無害的目錄中刪除損壞的符號鏈接,您甚至可能會破壞您的系統...
答案2
正如 rozcietrzewiacz 已經評論的那樣,find -L
將搜尋擴展到符號連結目錄可能會產生意想不到的結果,因此這不是最佳方法。還沒有人提到的是
find /path/to/search -xtype l
是更簡潔、邏輯相同的命令
find /path/to/search -type l -xtype l
到目前為止提出的解決方案都無法檢測循環符號鏈接,這是另一種類型的破壞。 這個問題解決可移植性。總而言之,尋找損壞的符號連結(包括循環連結)的可移植方法是:
find /path/to/search -type l -exec test ! -e {} \; -print
有關更多詳細信息,請參閱這個問題或者ynform.org。當然,這一切的最終來源是findutils 文檔。
答案3
命令symlinks
來自http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz可用於識別具有各種特徵的符號連結。例如:
$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a
答案4
我相信將-L
標誌添加到您的命令中將使您擺脫grep
:
$ find -L . -type l
http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
從手冊:
-L
使每個符號連結返回的文件資訊和文件類型(參見
stat
(2))是連結引用的文件的資訊和文件類型,而不是連結本身。如果引用的文件不存在,則文件資訊和類型將用於連結本身。