前言
最近不是 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 了(单身二十多年的手速可不是白练的~)。
若本文对你有用,欢迎关注我,给我点赞哦 ~