linux连个文件都删除不了,什么鬼!
前言
最近不是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 了(单身二十多年的手速可不是白练的~)。
若本文对你有用,欢迎关注我,给我点赞哦 ~
linux连个文件都删除不了,什么鬼!的更多相关文章
- 解决Linux用户模板文件被删除后显示不正常问题
缺失用户模板文件(用户骨架文件)会导致shell提示符不完整,可以到/etc/skel/目录下复制相关文件来恢复 (1).创建测试环境,删除模板文件 [root@xuexi ~]# useradd t ...
- Linux下的文件与目录权限
一.用户(User).群组(Group)和其他人(Others) linux是多用户多任务的操作系统,同一时刻可能会有多个用户登录系统,考虑到文件的安全性等问题,所以Linux下的文件都属于一个特定的 ...
- linux下的文件类型
在Linux中一切设备皆文件,首先来看一下Linux下的文件都有哪些分类,也就是文件类型 文件类型:普通文件(包括shell脚本,文档,音频,视频).目录文件.设备文件(又细分为字符设备文件和块设备文 ...
- java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息
1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...
- Linux下通过 rm -f 删除大量文件时报错:Argument list too long
Linux下通过 rm -f 删除大量的小文件时出现类似如下错误信息: -bash: /bin/rm: Argument list too long 如下图所示: 问题原因 如果待删除文件中包含的小 ...
- 深入理解linux关闭文件和删除文件
背景介绍 最近看了linux系统编程(linux system programming)一书,结合深入理解linux内核(understanding the linux kernel)一书,深入理解了 ...
- 学习Linux二(创建、删除文件和文件夹命令)
转自:http://www.cnblogs.com/zf2011/archive/2011/05/17/2049155.html 今天学习了几个命令,是创建.删除文件和文件夹的,在linux里,文件 ...
- Linux下tmp文件夹的文件自动删除的问题(转)
场景: 近日发现有一台机器tmp文件夹下放置的文件无辜丢失,而且排查发现是自动丢失,并且,只是删除10天之前的文件. 本来以为是哪位写了一个自动执行脚本, find了一下10天前的文件删除了. 结果, ...
- Linux操作系统启动故障排错之"/etc/fstab"文件被删除恢复案例
Linux操作系统启动故障排错之"/etc/fstab"文件被删除恢复案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模拟故障 [root@yinzhe ...
随机推荐
- CF1335E Three Blocks Palindrome
就是我这个菜鸡,赛时写出了 E2 的做法,但是算错复杂度,导致以为自己的做法只能AC E1,就没交到 E2 上,然后赛后秒A..... 题意 定义一种字串为形如:\([\underbrace{a, a ...
- python(运算符)
一.运算符 1.算数运算符 (1)加(+) 注意:字符串与整数之间不能进行相加,需要通过str()或int()进行转换数据类型 整数与整数相加 >>> 1 + 1 2 >> ...
- 关于2020.04.26【MySQL导出数据到文件中的方法】的补充
之前导出的数据文件中没有表的列名,感觉不够完整,摸索一下发现带表列名导出也是可以的,只试了导出txt和csv两种文件类型的方法. 1.导出数据到txt文件中(包含数据表列名)的方法:先选择 ...
- 值得收藏的js原型详解
从虚无到Object 起初,地是空虚混沌,渊面黑暗:这时候一切还是null 神说,要有原型,于是就有了prototype 原型从凭空产生,于是需要一个指向于null的特征,人们把这种特征叫做隐式原型, ...
- [hdu]5202
思路:把所有'?'用'a'代替,如果冲突则最后一个改为'b',注意特判最后一个问号在中间的情况.
- 错误 在应用程序级别之外使用注册为 allowDefinition='MachineToApplic
错误 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的.如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误. 如果 ...
- java-> 分包分层
项目分层(分包)的作用 程序为什么要分包分层? 以顾客去饭店吃饭案例分析一下: 小饭店: 一个服务员搞定(接待顾客\点菜\炒菜) 大饭店: 迎宾员(是否有预定\ 询问吃中餐还是西餐或者烧烤等\ 几位用 ...
- net core中Vue.component单独一个文件不运行,不报错的处理
Vue.component代码段原先是放到view下的cshtml中的,可以正常运行,后来为了方便代码管理,将这块代码块单独放到一个js文件中,结果点击按钮等等都没有任何反应了,同时js控制台也不报错 ...
- GitHub使用SSH连接以及生成修改添加密钥详细过程
目录 1. 先看看本地有没有SSH密钥 2. 生成/修改密钥 3. 把SSH密钥添加到ssh-agent 4. 把SSH密钥添加到GitHub账户里 5. 测试使用ssh地址clone仓库 6. 把远 ...
- ES6新增API
1.Object.assign(a,b,c) a.b均为对象,意思是把b对象的属性添加到a上面去.如果a中已经定义了某个属性,b也定义了的话就会覆盖a的,就是后面覆盖前面的,后面生命的有效.是 一种浅 ...