天天看點

Linux 檔案删除不了? 一招教你搞定!

前言

最近不是redis 6.0 出了嗎,官網介紹最新穩定版本是 6.0.3 。于是,我就準備在自己的破小伺服器上安裝一下。于是,出現了後續的糟心事 (linux 下的檔案正常删除不了)。

下載下傳了最新版本,在源碼包裡邊 make 之後,出現了好幾個錯誤,上網查了下,有人說最新版本有問題,建議使用 5.0.8 。我嘞個去,我想也沒想就相信了。(其實,也有可能跟我的系統沒安裝 tcl 有關系,這就是後話了)

然後,我就下載下傳了 5.0.8 版本的redis,重新安裝。

發現問題

從官網下載下傳了 5.0.8 的源碼包之後,就從我本地(win系統)通過 scp 指令上傳到伺服器。如下,

Linux 檔案删除不了? 一招教你搞定!

由于源碼包下載下傳到了桌面位置,是以本地路徑的位址就寫的絕對路徑 “C:\ …” ,上傳到遠端伺服器的 /root 目錄下。誰成想到了伺服器上的檔案名是這個樣子。如下,

Linux 檔案删除不了? 一招教你搞定!

檔案名竟然把本地檔案的路徑也帶上了。這就讓人很頭疼了,我想着,就把它重新命名一下吧。

這麼長的檔案名,我肯定複制粘貼啊。但是粘貼之後發現 linux 下把前邊當成一個路徑來解析了,按照的是 linux 下檔案夾的路徑格式(windows的檔案分隔符為反斜杠"\",linux下為"/"),如下,

Linux 檔案删除不了? 一招教你搞定!

很明顯,在linux下預設是沒有根路徑為 “/c” 這樣的路徑的。是以,就報錯沒有找到該目錄。

這就讓人很 dan 疼了,重命名不行,那就嘗試下删除吧,大不了我重新上傳檔案就是了。

但是,結果也并不如我所願, 執行删除指令之後,檔案還在,

Linux 檔案删除不了? 一招教你搞定!

原因,我猜測也是和重命名一樣,linux 把檔案名解析為路徑了。然後看到網上說,給檔案名加引号可以避免這種情況,我就操作了一番,并刻意地手打原檔案的名字。(原為反斜杠)

Linux 檔案删除不了? 一招教你搞定!

然而并沒有什麼用,怎樣都繞不過它把這個檔案名當成路徑來解析。。。

解決問題

後來,還是群裡的小夥伴給我的解決方案,真是 tql 。遂記錄如下,

 ​

思路就是,通過檔案索引節點号來删除,繞過檔案名。先通過 ​

​ls -i​

​,顯示所有檔案索引節點号(如下,目标檔案的索引節點号為 477536),然後通過索引節點号來删除檔案。

Linux 檔案删除不了? 一招教你搞定!

檔案索引節點号

那麼,有的童鞋就會問了,什麼是檔案索引節點号呢?

在這之前需要了解一下 linux 中檔案的存儲形式,以及檔案索引節點。

在 linux 下,檔案在磁盤上的存儲是以“塊”為機關的,“塊”是檔案的最小存儲單元。每個塊又包含多個扇區,每個扇區大小為 512 位元組。通常 8 個扇區組成一個“塊”。

由于檔案的資料都存儲在“塊”中,是以我們還需要找到一塊區域來儲存檔案的元資訊,包括檔案的權限,擁有者,大小,以及存儲的位置。而這樣的區域就叫做檔案索引節點(inode)。

元資訊可以了解為是用來儲存檔案相關資訊的資訊。可以拿 Java 中的元注解來類比(元注解就是用來标注注解的注解)。

每個 inode 都有一個号碼,這個就叫做檔案索引節點号。作業系統最終是通過檔案索引節點号來識别不同的檔案的,而不是通過檔案名。

如下圖,可以通過 stat 指令列印出一個檔案(以 TankServer.zip為例)的 inode 所有元資訊,還有 inode 号。

Linux 檔案删除不了? 一招教你搞定!

檔案名和檔案索引節點号之間的關系,有點類似于域名和 IP 之間的映射關系。

比如通路百度,我們隻會記得它的域名為"www.baidu.com",并不會去記它的 IP 位址是多少,而且 IP 對我們來說也不好記。這就好比,我們程式員隻用記檔案名,而不知道它的檔案索引節點号一樣。

但是實際上,最終還是需要域名解析器 DNS 把域名解析為具體的 IP 位址(此處不考慮CDN),才能讓其他伺服器識别。這就好比,linux 系統最終隻會通過檔案索引節點号來識别檔案。

說了這麼多,其實我們隻是想知道目前需要删除檔案的檔案索引節點号而已。既然不能通過檔案名删除,我直接越過你,找到對應的檔案索引節點号不就可以了(相當于,我如果知道百度的 IP 位址,可以直接通過 IP 通路)。

删除指令

那麼知道了檔案索引節點号,我們就可以通過以下的格式來删除它對應的檔案。

find ./ -inum inode号 -exec rm {} \;
      

前半部分,find 指令是在目前目錄下找到 inode 号對應的檔案。後半部分 -exec 表示查找後緊跟着要執行的指令。rm 就是删除檔案的指令。删除哪個檔案呢,{} 作用就是把 find 的結果作為參數傳給 -exec 。

最後還要注意, 使用 -exec 參數,需要用 ; 分号結尾,不然會報錯如下圖。 而 "\"反斜杠是為了轉義分号。

Linux 檔案删除不了? 一招教你搞定!

結語

以上就是在 linux 中删除檔案時遇到的坑。若你遇到類似的問題,或者出現了某個檔案名中有特殊字元導緻删除不了檔案,也可以嘗試一下以上的操作方式哦。

溫馨提示: 删除檔案時,一定要小心哦,别最後删庫跑路了!

我剛才測試時,就在 inum 前少加了橫杠 (正确應該為 -inum)。導緻整個指令删除了其它目錄檔案,如下圖。

Linux 檔案删除不了? 一招教你搞定!

幸好這是個目錄檔案,也幸好我沒用 rm -rf 遞歸删除檔案,要不然,這個檔案夾就廢了。下邊繼續執行下去,還要删除 npm,天知道最後會不會把系統檔案也删了。

Linux 檔案删除不了? 一招教你搞定!

幸好我手快,及時 Ctrl + C 了(單身二十多年的手速可不是白練的~)。

繼續閱讀