前言
最近不是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 ,遂記錄如下,
解決鏈接:https://www.askcto.com/searchInfo?qId=7056cab522d84d0eb9c1a36eba66b324
思路就是,通過檔案索引節點號來洗掉,繞過檔案名,先通過 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 訪問),
PS:更多關于 inode 的介紹,可以參考阮一峰老師的博客:http://www.ruanyifeng.com/blog/2011/12/inode.html
洗掉命令
那么知道了檔案索引節點號,我們就可以通過以下的格式來洗掉它對應的檔案,
find ./ -inum inode號 -exec rm {} \;
前半部分,find 命令是在當前目錄下找到 inode 號對應的檔案,后半部分 -exec 表示查找后緊跟著要執行的命令,rm 就是洗掉檔案的命令,洗掉哪個檔案呢,{} 作用就是把 find 的結果作為引數傳給 -exec ,
最后還要注意, 使用 -exec 引數,需要用 ; 分號結尾,不然會報錯如下圖, 而 "\"反斜杠是為了轉義分號,

結語
以上就是在 linux 中洗掉檔案時遇到的坑,若你遇到類似的問題,或者出現了某個檔案名中有特殊字符導致洗掉不了檔案,也可以嘗試一下以上的操作方式哦,
溫馨提示: 洗掉檔案時,一定要小心哦,別最后刪庫跑路了!
我剛才測驗時,就在 inum 前少加了橫杠 (正確應該為 -inum),導致整個命令洗掉了其它目錄檔案,如下圖,

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

幸好我手快,及時 Ctrl + C 了(單身二十多年的手速可不是白練的~),
若本文對你有用,歡迎關注我,給我點贊哦 ~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/179611.html
標籤:Java
上一篇:論文學習筆記1
