如何在 Linux 上查找和刪除損壞的符號鏈接

已發表: 2022-01-29
Linux 筆記本電腦上的終端窗口。
Fatmawati Achmad Zaenuri/Shutterstock

Linux 上的符號鏈接是一個很棒的功能,但它們可能會損壞並指向任何內容。 以下是如何找到損壞的符號鏈接、查看它們並在需要時將它們從系統中刪除。

符號鏈接 101

符號鏈接,也稱為“軟鏈接”和“符號鏈接”,是一種可以指向文件和目錄的快捷方式。 符號鏈接看起來就像文件管理器窗口中的常規文件或目錄。 它還顯示為終端窗口中文件列表中的一個條目。 符號鏈接指向的文件或目錄可以位於文件系統樹中的任何位置。

例如,假設您的主目錄中有一個名為“dave-link”的符號鏈接,它指向位於文件系統樹中其他位置的名為“text-file.txt”的文件。 您在符號鏈接上使用的命令會自動應用於它指向的文件。 如果您嘗試在符號鏈接上使用catless ,您實際上會看到“text-file.txt”文件的內容。

標準的 Linux 安裝包含許多符號鏈接。 即使您自己不創建任何內容,操作系統也會使用它們。 應用程序安裝例程通常使用符號鏈接指向可執行文件。 軟件更新時,二進製文件被新版本替換,所有符號鏈接都照常工作,只要新文件名與舊文件名相同。

我們可以通過在根目錄中使用ls輕鬆查看一些符號鏈接。 一些條目以不同的顏色顯示——在我們的 Ubuntu 20.10 測試機器上,它們以淺藍色顯示。

我們輸入以下內容:

 ls / 

廣告

我們可以使用-l (長列表)選項進行更深入的研究。 我們鍵入以下命令來查看所有“lib”條目和單個“bin”條目:

 ls -l /lib* /bin 

每行的開頭是一個“l”,表示該項目是一個符號鏈接。 “->”之後的文本顯示符號鏈接指向的內容。 在我們的示例中,目標都是目錄。

權限被列為所有者、組和其他人的讀取、寫入和執行。 這些是默認的虛假條目。 它們不反映符號鏈接指向的對象的​​實際權限。 文件系統優先考慮目標文件或目錄的權限。

損壞的符號鏈接

當符號鏈接指向的文件被刪除或移動到另一個位置時,符號鏈接會被破壞(或懸空)。 如果應用程序的卸載例程無法正常運行,或者在完成之前被中斷,則可能會留下損壞的符號鏈接。

如果有人在不知道符號鏈接指向它的情況下手動刪除文件,則這些符號鏈接將不再起作用。 它們就像路標一樣指向一個被推土機推平的城鎮。

我們可以使用當前目錄中名為“hello”的符號鏈接輕鬆查看此行為。 我們輸入以下內容,使用ls來查看:

 ls -l
廣告

它指向名為“bin”的目錄中名為“htg”的程序。 如果我們“運行”符號鏈接,它會為我們執行程序:

 。/你好

我們現在可以通過直接運行程序來檢查是否發生了這種情況:

 ../bin/htg

正如預期的那樣,我們得到了相同的響應。 讓我們刪除程序文件:

 rm ../bin/htg

現在,當我們查看符號鏈接時,我們看到它以紅色列出,因為 Linux 知道它已損壞。 它還告訴我們它曾經指向的位置,因此我們可以替換文件、重新編譯程序或執行任何必要的操作來修復符號鏈接。

請注意,如果我們嘗試運行符號鏈接,我們得到的錯誤引用符號鏈接名稱,而不是符號鏈接指向的程序的名稱。

我們輸入以下內容:

 。/你好

查找損壞的符號鏈接

大多數現代版本的find都有xtype (擴展類型)選項,它簡化了查找損壞的符號鏈接的過程。 我們將l標誌與xtype一起使用,告訴它搜索鏈接。 使用findxtype如下,沒有任何其他type標誌,強制xtype返回斷開的鏈接:

 尋找 。 -xtype l 

在我們的測試主目錄中運行命令會發現很多損壞的符號鏈接。 請注意,默認情況下搜索是遞歸的,因此它會自動搜索所有子目錄。

正如我們所料,我們故意破壞的“hello”符號鏈接已列出。 其他符號鏈接之一與 Firefox 瀏覽器相關,其餘符號鏈接與快照相關聯。

如果我們使用-l (lines) 選項通過wc管道輸出,我們可以計算行數,這與計算損壞的符號鏈接相同。

我們輸入以下內容:

 尋找 。 -xtype l | wc -l 

我們被告知我們有 24 個損壞的符號鏈接指向任何內容。

查找、查看然後刪除

在您急於刪除所有損壞的符號鏈接之前,請查看find命令的結果。 查看是否有任何損壞的符號鏈接的正當理由。

有時,符號鏈接可能是問題所在,而不是目標文件。 如果符號鏈接創建不正確,它可能什麼都沒有,但真正的目標是存在的。 在這種情況下,重新創建符號鏈接將是解決方法。

一個明顯損壞的符號鏈接也有可能被用作其他東西,例如文件鎖定的指示器或其他 go/no go 指示器。 Firefox 這樣做; 這就是我們列表中的第一個符號鏈接。 但是,我們的測試機器上沒有使用 Firefox,因此我們可以安全地刪除它。

廣告

也有可能目標只是定期出現,這是該特定軟件的預期(和期望)行為。 也許目標文件是從另一台機器或云端複製的,它執行它的功能,然後再次刪除,只是在下一個週期被不同的程序替換。

損壞的符號鏈接也可能是軟件安裝失敗的症狀。 在這種情況下,您應該手動修復它或重複安裝,而不是刪除符號鏈接。

修復需要保留的斷開鏈接後,重複該命令以執行搜索。 然後,搜索結果中應該不存在固定的符號鏈接。

為了安全起見,最好將您的符號鏈接刪除限制在您自己的目錄中。 在以 root 身份或在系統目錄上運行這些命令時要格外小心。

刪除損壞的符號鏈接

-exec (執行)選項在find搜索結果上運行命令。 我們將使用rm刪除每個損壞的符號鏈接。 {}字符串被替換為每個損壞的符號鏈接的名稱,因為每個符號鏈接都是由find的。

我們必須使用分號 ( ; ) 來終止我們希望-exec運行的命令列表。 我們將使用反斜杠 ( \ ) 來“轉義”分號,因此它被視為find命令的一部分,而不是Bash應該執行的操作。

我們輸入以下內容:

 尋找 。 -xtype l -exec rm {} \; 

廣告

我們返回到命令提示符,沒有任何跡象表明發生了任何事情。 為了驗證損壞的鏈接是否已被刪除,我們重複該命令來查找它們,如下所示:

 尋找 。 -xtype l 

沒有任何匹配的結果,這意味著損壞的符號鏈接已被刪除。

記得先複習

同樣,在運行命令刪除符號鏈接之前,請務必花時間查看符號鏈接列表。 您可以通過運行命令在適當的目錄中刪除它們來避免刪除任何不確定的內容。

例如,在上面,我們可以在“.snap”目錄中運行命令,然後手動刪除單獨的“hello”符號鏈接。 這將使 Firefox 鎖定符號鏈接保持不變。