Linux 文件删除不了? 一招教你搞定!
前言
最近不是redis 6.0 出了嗎,官網(wǎng)介紹最新穩(wěn)定版本是 6.0.3 。于是,我就準(zhǔn)備在自己的破小服務(wù)器上安裝一下。于是,出現(xiàn)了后續(xù)的糟心事 (linux 下的文件正常刪除不了)。
下載了最新版本,在源碼包里邊 make 之后,出現(xiàn)了好幾個(gè)錯(cuò)誤,上網(wǎng)查了下,有人說(shuō)最新版本有問(wèn)題,建議使用 5.0.8 。我嘞個(gè)去,我想也沒(méi)想就相信了。(其實(shí),也有可能跟我的系統(tǒng)沒(méi)安裝 tcl 有關(guān)系,這就是后話了)
然后,我就下載了 5.0.8 版本的redis,重新安裝。
發(fā)現(xiàn)問(wèn)題
從官網(wǎng)下載了 5.0.8 的源碼包之后,就從我本地(win系統(tǒng))通過(guò) scp 命令上傳到服務(wù)器。如下,
由于源碼包下載到了桌面位置,因此本地路徑的地址就寫的絕對(duì)路徑 “C:\ …” ,上傳到遠(yuǎn)程服務(wù)器的 /root 目錄下。誰(shuí)成想到了服務(wù)器上的文件名是這個(gè)樣子。如下,
文件名竟然把本地文件的路徑也帶上了。這就讓人很頭疼了,我想著,就把它重新命名一下吧。
這么長(zhǎng)的文件名,我肯定復(fù)制粘貼啊。但是粘貼之后發(fā)現(xiàn) linux 下把前邊當(dāng)成一個(gè)路徑來(lái)解析了,按照的是 linux 下文件夾的路徑格式(windows的文件分隔符為反斜杠"\",linux下為"/"),如下,
很明顯,在linux下默認(rèn)是沒(méi)有根路徑為 “/c” 這樣的路徑的。因此,就報(bào)錯(cuò)沒(méi)有找到該目錄。
這就讓人很 dan 疼了,重命名不行,那就嘗試下刪除吧,大不了我重新上傳文件就是了。
但是,結(jié)果也并不如我所愿, 執(zhí)行刪除命令之后,文件還在,
原因,我猜測(cè)也是和重命名一樣,linux 把文件名解析為路徑了。然后看到網(wǎng)上說(shuō),給文件名加引號(hào)可以避免這種情況,我就操作了一番,并刻意地手打原文件的名字。(原為反斜杠)
然而并沒(méi)有什么用,怎樣都繞不過(guò)它把這個(gè)文件名當(dāng)成路徑來(lái)解析。。。
解決問(wèn)題
后來(lái),還是群里的小伙伴給我的解決方案,真是 tql 。遂記錄如下,
解決鏈接:https://www.askcto.com/searchInfo?qId=7056cab522d84d0eb9c1a36eba66b324
思路就是,通過(guò)文件索引節(jié)點(diǎn)號(hào)來(lái)刪除,繞過(guò)文件名。先通過(guò) ls -i,顯示所有文件索引節(jié)點(diǎn)號(hào)(如下,目標(biāo)文件的索引節(jié)點(diǎn)號(hào)為 477536),然后通過(guò)索引節(jié)點(diǎn)號(hào)來(lái)刪除文件。
文件索引節(jié)點(diǎn)號(hào)
那么,有的童鞋就會(huì)問(wèn)了,什么是文件索引節(jié)點(diǎn)號(hào)呢?
在這之前需要了解一下 linux 中文件的存儲(chǔ)形式,以及文件索引節(jié)點(diǎn)。
在 linux 下,文件在磁盤上的存儲(chǔ)是以“塊”為單位的,“塊”是文件的最小存儲(chǔ)單元。每個(gè)塊又包含多個(gè)扇區(qū),每個(gè)扇區(qū)大小為 512 字節(jié)。通常 8 個(gè)扇區(qū)組成一個(gè)“塊”。
由于文件的數(shù)據(jù)都存儲(chǔ)在“塊”中,因此我們還需要找到一塊區(qū)域來(lái)保存文件的元信息,包括文件的權(quán)限,擁有者,大小,以及存儲(chǔ)的位置。而這樣的區(qū)域就叫做文件索引節(jié)點(diǎn)(inode)。
元信息可以理解為是用來(lái)保存文件相關(guān)信息的信息。可以拿 Java 中的元注解來(lái)類比(元注解就是用來(lái)標(biāo)注注解的注解)。
每個(gè) inode 都有一個(gè)號(hào)碼,這個(gè)就叫做文件索引節(jié)點(diǎn)號(hào)。操作系統(tǒng)最終是通過(guò)文件索引節(jié)點(diǎn)號(hào)來(lái)識(shí)別不同的文件的,而不是通過(guò)文件名。
如下圖,可以通過(guò) stat 命令打印出一個(gè)文件(以 TankServer.zip為例)的 inode 所有元信息,還有 inode 號(hào)。
文件名和文件索引節(jié)點(diǎn)號(hào)之間的關(guān)系,有點(diǎn)類似于域名和 IP 之間的映射關(guān)系。
比如訪問(wèn)百度,我們只會(huì)記得它的域名為"www.baidu.com",并不會(huì)去記它的 IP 地址是多少,而且 IP 對(duì)我們來(lái)說(shuō)也不好記。這就好比,我們程序員只用記文件名,而不知道它的文件索引節(jié)點(diǎn)號(hào)一樣。
但是實(shí)際上,最終還是需要域名解析器 DNS 把域名解析為具體的 IP 地址(此處不考慮CDN),才能讓其他服務(wù)器識(shí)別。這就好比,linux 系統(tǒng)最終只會(huì)通過(guò)文件索引節(jié)點(diǎn)號(hào)來(lái)識(shí)別文件。
說(shuō)了這么多,其實(shí)我們只是想知道當(dāng)前需要?jiǎng)h除文件的文件索引節(jié)點(diǎn)號(hào)而已。既然不能通過(guò)文件名刪除,我直接越過(guò)你,找到對(duì)應(yīng)的文件索引節(jié)點(diǎn)號(hào)不就可以了(相當(dāng)于,我如果知道百度的 IP 地址,可以直接通過(guò) IP 訪問(wèn))。
PS:更多關(guān)于 inode 的介紹,可以參考阮一峰老師的博客:http://www.ruanyifeng.com/blog/2011/12/inode.html
刪除命令
那么知道了文件索引節(jié)點(diǎn)號(hào),我們就可以通過(guò)以下的格式來(lái)刪除它對(duì)應(yīng)的文件。
find ./ -inum inode號(hào) -exec rm {} \;前半部分,find 命令是在當(dāng)前目錄下找到 inode 號(hào)對(duì)應(yīng)的文件。后半部分 -exec 表示查找后緊跟著要執(zhí)行的命令。rm 就是刪除文件的命令。刪除哪個(gè)文件呢,{} 作用就是把 find 的結(jié)果作為參數(shù)傳給 -exec 。
最后還要注意, 使用 -exec 參數(shù),需要用 ; 分號(hào)結(jié)尾,不然會(huì)報(bào)錯(cuò)如下圖。 而 "\"反斜杠是為了轉(zhuǎn)義分號(hào)。
結(jié)語(yǔ)
以上就是在 linux 中刪除文件時(shí)遇到的坑。若你遇到類似的問(wèn)題,或者出現(xiàn)了某個(gè)文件名中有特殊字符導(dǎo)致刪除不了文件,也可以嘗試一下以上的操作方式哦。
溫馨提示: 刪除文件時(shí),一定要小心哦,別最后刪庫(kù)跑路了!
我剛才測(cè)試時(shí),就在 inum 前少加了橫杠 (正確應(yīng)該為 -inum)。導(dǎo)致整個(gè)命令刪除了其它目錄文件,如下圖。
幸好這是個(gè)目錄文件,也幸好我沒(méi)用 rm -rf 遞歸刪除文件,要不然,這個(gè)文件夾就廢了。下邊繼續(xù)執(zhí)行下去,還要?jiǎng)h除 npm,天知道最后會(huì)不會(huì)把系統(tǒng)文件也刪了。
幸好我手快,及時(shí) Ctrl + C 了(單身二十多年的手速可不是白練的~)。
若文章對(duì)你有用,歡迎關(guān)注我,給我點(diǎn)贊哦 ~
福利:微信搜索 「煙雨星空」,獲取更多技術(shù)好文,后臺(tái)回復(fù) 【666】 可免費(fèi)領(lǐng)取 1000G 程序員資料。
總結(jié)
以上是生活随笔為你收集整理的Linux 文件删除不了? 一招教你搞定!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: **matlab subs函数**
- 下一篇: python相减函数subs,SUBS(