如何在 Linux 中刪除符號連結檔案?
概述
符號連結允許我們更輕鬆地訪問檔案,即使它們位於不同的位置。在本教程中,我們將學習如何從系統中刪除符號連結並將其替換為原始檔案。
問題
假設我們有一個 aDir 資料夾和一個 aFile.text 檔案位於我們的當前工作目錄下。我們還建立了兩個指向該資料夾和子資料夾的符號連結檔案:
$ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt lrwxrwxrwx 1 kent kent 4 Apr 26 23:48 dirLink -> aDir/ lrwxrwxrwx 1 kent kent 9 Apr 26 23:48 fileLink -> aFile.txt
我們希望刪除這兩個軟連結檔案。
您可以使用幾種不同的方法來實現這一點。
使用 rm 命令
rm(刪除)命令可以刪除檔案和資料夾。我們可以使用此命令刪除符號連結。
首先,讓我們使用 'rm'(刪除)命令刪除 fileLink。
$ rm fileLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt lrwxrwxrwx 1 kent kent 4 Apr 26 23:48 dirLink -> aDir/
如上所示,我們已成功刪除了名為 Link 的符號連結。刪除符號連結及其目標的語法相同。
接下來,嘗試刪除 dirLink 連結:
$ rm dirLink/ rm: cannot remove 'dirLink/': Is a directory
rmdir 命令拒絕刪除目錄,而是列印錯誤訊息。該訊息看起來不正確,因為我們沒有 dirLink 目錄。命令哪裡出錯了?
我們在連結名稱後添加了一個正斜槓。
在嘗試使用 rm 命令刪除符號連結時,我們應該使用 -f 選項。無論目標是檔案、目錄還是兩者兼而有之,我們都不應新增 / 字元。
在瞭解問題發生的原因後,現在讓我們修復它,看看問題是否已解決。
$ rm dirLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt
太好了!dirlink 連結現已刪除。
使用 unlink 命令
unlink 命令屬於 CoreUtils 包,在所有 Linux 發行版上都可用。
讓我們重新建立這兩個連結,看看是否可以使用 unlinked 命令刪除它們。
我們首先要刪除 fileLink 連結。
$ unlink fileLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt lrwxrwxrwx 1 kent kent 4 Apr 27 00:15 dirLink -> aDir/
它非常易於使用,並且有效。
現在,我們將 dirLink/ 傳遞給 unlink 以檢視它是否可以刪除該連結。
$ unlink dirLink/ unlink: cannot unlink 'dirLink/': Not a directory
如果我們傳遞一個包含尾部斜槓的 URL,則 unlinked 命令也不會刪除該連結。
因此,我們應該只將連結名稱傳遞給 unlink:
$ unlink dirLink $ ls -l total 0 drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/ -rw-r--r-- 1 kent kent 0 Apr 26 23:46 aFile.txt
如果我們將普通檔案的名稱傳遞給 unlinked 命令,它將刪除該檔案,即使它不是連結檔案。
$ unlink aFile.txt $ ls -l total 0 drwxr-xr-x 3 kent kent 60 Apr 27 00:22 ./ drwxrwxrwt 23 root root 840 Apr 27 00:18 ../ drwxr-xr-x 2 kent kent 40 Apr 26 23:48 aDir/
一次刪除多個連結
我們可以使用 find | xargs rm 組合刪除 find 命令結果中的檔案。我們可以按照相同的步驟刪除符號連結。
現在,我們來看另一個例子:
$ tree . ├── 2bDeleted_01.txt -> aFile.txt ├── 2bDeletedDir -> aDir ├── 2bDeletedDir_01 -> aDir ├── 2bDeletedDir_02 -> aDir ├── 2bDeleted_I_am_not_a_link.txt ├── 2bDeleted.txt -> aFile.txt ├── aDir │ ├── 2bDeleted_etc -> /etc │ └── keepMe_etc -> /etc ├── aFile.txt ├── keepMeDir -> aDir └── keepMe.txt -> aFile.txt
7 個目錄,5 個檔案
上面的輸出表明,我們的當前目錄和子目錄中有多個連結。一些連結的名稱為 2BDeleted*,而另一些連結的名稱為 keepMe*。
我們希望刪除所有名稱與正則表示式 "2bDeleted*" 匹配的符號連結。
我們應該小心不要刪除任何符號連結。例如,如果我們想保持 2BDeleted_I_Am_Not_A_Link.txt 正則檔案完整,那麼我們不應該刪除名為 2BDeleted_ 的檔案。
接下來,請參閱我們如何使用 find | xargs rm(或 unlink)組合刪除連結檔案。
我們需要做的第一件事是編寫一個命令來查詢我們要從站點中刪除的所有 URL。
$ find . -type l -name '2bDeleted*' ./2bDeleted.txt ./2bDeleted_01.txt ./2bDeletedDir ./2bDeletedDir_01 ./2bDeletedDir_02 ./aDir/2bDeleted_etc
我們向 find 函式傳遞兩個引數:
type l - 用於僅搜尋符號連結檔案
name ‘2bDeleted*’ - 連結名稱與給定模式匹配
接下來,我們可以將輸出管道傳輸到 xargs 命令:
$ find . -type l -name '2bDeleted*' | xargs -I{} rm "{}" $ tree . ├── 2bDeleted_I_am_not_a_link.txt ├── aDir │ └── keepMe_etc -> /etc ├── aFile.txt ├── keepMeDir -> aDir └── keepMe.txt -> aFile.txt
3 個目錄,3 個檔案
如樹形圖所示,該命令按預期工作。
結論
我們已經瞭解到,當我們想要刪除符號連結時,可以使用 rm 或 unlink 命令。
但是,我們應該記住,無論我們使用什麼命令,都應該始終傳遞連結名稱,而不包括尾部正斜槓。
我們還討論瞭如何使用示例一次從多個目錄中刪除符號連結。