linux连个文件都删除不了,什么鬼!

前言

最近不是redis 6.0 出了吗,官网介绍最新稳定版本是 6.0.3 。因而,我就准备在本身的破小服务器上安装一下。因而,出现了后续的糟心事 (linux 下的文件正常删除不了)。html

下载了最新版本,在源码包里边 make 以后,出现了好几个错误,上网查了下,有人说最新版本有问题,建议使用 5.0.8 。我嘞个去,我想也没想就相信了。(其实,也有可能跟个人系统没安装 tcl 有关系,这就是后话了)node

而后,我就下载了 5.0.8 版本的redis,从新安装。linux

发现问题

从官网下载了 5.0.8 的源码包以后,就从我本地(win系统)经过 scp 命令上传到服务器。以下,程序员

因为源码包下载到了桌面位置,所以本地路径的地址就写的绝对路径 “C: ...” ,上传到远程服务器的 /root 目录下。谁成想到了服务器上的文件名是这个样子。以下,redis

文件名居然把本地文件的路径也带上了。这就让人很头疼了,我想着,就把它从新命名一下吧。npm

这么长的文件名,我确定复制粘贴啊。可是粘贴以后发现 linux 下把前边当成一个路径来解析了,按照的是 linux 下文件夹的路径格式(windows的文件分隔符为反斜杠"\",linux下为"/"),以下,windows

很明显,在linux下默认是没有根路径为 "/c" 这样的路径的。所以,就报错没有找到该目录。服务器

这就让人很 dan 疼了,重命名不行,那就尝试下删除吧,大不了我从新上传文件就是了。测试

可是,结果也并不如我所愿, 执行删除命令以后,文件还在,spa

缘由,我猜想也是和重命名同样,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 了(单身二十多年的手速可不是白练的~)。

若本文对你有用,欢迎关注我,给我点赞哦 ~

相关文章
相关标签/搜索