前言
最近不是redis 6.0 出了嗎,官網介紹最新穩定版本是 6.0.3 。于是,我就準備在自己的破小伺服器上安裝一下。于是,出現了後續的糟心事 (linux 下的檔案正常删除不了)。
下載下傳了最新版本,在源碼包裡邊 make 之後,出現了好幾個錯誤,上網查了下,有人說最新版本有問題,建議使用 5.0.8 。我嘞個去,我想也沒想就相信了。(其實,也有可能跟我的系統沒安裝 tcl 有關系,這就是後話了)
然後,我就下載下傳了 5.0.8 版本的redis,重新安裝。
發現問題
從官網下載下傳了 5.0.8 的源碼包之後,就從我本地(win系統)通過 scp 指令上傳到伺服器。如下,
由于源碼包下載下傳到了桌面位置,是以本地路徑的位址就寫的絕對路徑 “C:\ …” ,上傳到遠端伺服器的 /root 目錄下。誰成想到了伺服器上的檔案名是這個樣子。如下,
檔案名竟然把本地檔案的路徑也帶上了。這就讓人很頭疼了,我想着,就把它重新命名一下吧。
這麼長的檔案名,我肯定複制粘貼啊。但是粘貼之後發現 linux 下把前邊當成一個路徑來解析了,按照的是 linux 下檔案夾的路徑格式(windows的檔案分隔符為反斜杠"\",linux下為"/"),如下,
很明顯,在linux下預設是沒有根路徑為 “/c” 這樣的路徑的。是以,就報錯沒有找到該目錄。
這就讓人很 dan 疼了,重命名不行,那就嘗試下删除吧,大不了我重新上傳檔案就是了。
但是,結果也并不如我所願, 執行删除指令之後,檔案還在,
原因,我猜測也是和重命名一樣,linux 把檔案名解析為路徑了。然後看到網上說,給檔案名加引号可以避免這種情況,我就操作了一番,并刻意地手打原檔案的名字。(原為反斜杠)
然而并沒有什麼用,怎樣都繞不過它把這個檔案名當成路徑來解析。。。
解決問題
後來,還是群裡的小夥伴給我的解決方案,真是 tql 。遂記錄如下,
思路就是,通過檔案索引節點号來删除,繞過檔案名。先通過
ls -i
,顯示所有檔案索引節點号(如下,目标檔案的索引節點号為 477536),然後通過索引節點号來删除檔案。
檔案索引節點号
那麼,有的童鞋就會問了,什麼是檔案索引節點号呢?
在這之前需要了解一下 linux 中檔案的存儲形式,以及檔案索引節點。
在 linux 下,檔案在磁盤上的存儲是以“塊”為機關的,“塊”是檔案的最小存儲單元。每個塊又包含多個扇區,每個扇區大小為 512 位元組。通常 8 個扇區組成一個“塊”。
由于檔案的資料都存儲在“塊”中,是以我們還需要找到一塊區域來儲存檔案的元資訊,包括檔案的權限,擁有者,大小,以及存儲的位置。而這樣的區域就叫做檔案索引節點(inode)。
元資訊可以了解為是用來儲存檔案相關資訊的資訊。可以拿 Java 中的元注解來類比(元注解就是用來标注注解的注解)。
每個 inode 都有一個号碼,這個就叫做檔案索引節點号。作業系統最終是通過檔案索引節點号來識别不同的檔案的,而不是通過檔案名。
如下圖,可以通過 stat 指令列印出一個檔案(以 TankServer.zip為例)的 inode 所有元資訊,還有 inode 号。
檔案名和檔案索引節點号之間的關系,有點類似于域名和 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 中删除檔案時遇到的坑。若你遇到類似的問題,或者出現了某個檔案名中有特殊字元導緻删除不了檔案,也可以嘗試一下以上的操作方式哦。
溫馨提示: 删除檔案時,一定要小心哦,别最後删庫跑路了!
我剛才測試時,就在 inum 前少加了橫杠 (正确應該為 -inum)。導緻整個指令删除了其它目錄檔案,如下圖。
幸好這是個目錄檔案,也幸好我沒用 rm -rf 遞歸删除檔案,要不然,這個檔案夾就廢了。下邊繼續執行下去,還要删除 npm,天知道最後會不會把系統檔案也删了。
幸好我手快,及時 Ctrl + C 了(單身二十多年的手速可不是白練的~)。