Linux 如何利用 inode 删除特殊符号文件

今天在安装应用的过程中,发现主机某账户下出现了很多不知名的文件:

1
2
3
4
5
6
7
8
9
10
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls -lGS
总用量 6966008
……
-rw-rw-r-- 1 uatusr01 0 6月 25 11:40 ?
-rw-rw-r-- 1 uatusr01 0 6月 25 11:39 ?
-rw-rw-r-- 1 uatusr01 0 6月 25 11:39 ??
-rw-rw-r-- 1 uatusr01 0 5月 24 16:26 ??????
-rw-rw-r-- 1 uatusr01 0 5月 24 16:26 ??ٮ?e?
-rw-rw-r-- 1 uatusr01 0 5月 24 16:26 Q??1$?0?^1?
uatusr01@tst10:/uniiof/uatusers/uatusr01>

且不说它们是怎么来的(绝大多数是误操作引起的),怎么删除倒是个大问题。

纯问号的和包含字符比较多的好处理,只要 ls 能单独找出来的,都可以用 xargs 来删掉,比如:

1
2
3
4
5
6
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls ?
? ?
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls ?|xargs rm
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls ?
ls: 无法访问?: 没有那个文件或目录
uatusr01@tst10:/uniiof/uatusers/uatusr01>

或者:

1
2
3
4
5
6
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls Q*1*0*1*
Q??1$?0?^1?
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls Q*1*0*1*|xargs rm
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls Q*1*0*1*
ls: 无法访问Q*1*0*1*: 没有那个文件或目录
uatusr01@tst10:/uniiof/uatusers/uatusr01>

比较难处理的,是这些使用 ls 无法单独区分出来的文件:

1
2
3
4
5
6
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls -lGS
总用量 6966008
……
-rw-rw-r-- 1 uatusr01 0 5月 24 16:26 ??????
-rw-rw-r-- 1 uatusr01 0 5月 24 16:26 ??ٮ?e?
uatusr01@tst10:/uniiof/uatusers/uatusr01>

如上面剩下的两个文件,第一个是由于问号太多,无法使用 ls 简单区分;第二个是由于包含的字符太少,无法和其他有用的文件进行区分,所以无法用 xargs 的方式进行删除。

这时可以通过 ls -i 命令,来获取到文件 inode 号,然后再使用 find 找到该 inode 号下的文件进行删除,具体方式如下:

找出 inode 号:

1
2
3
4
5
6
uatusr01@tst10:/uniiof/uatusers/uatusr01>ls -liGS
总用量 6966008
……
60034634 -rw-rw-r-- 1 uatusr01 0 5月 24 16:26 ??????
60034635 -rw-rw-r-- 1 uatusr01 0 5月 24 16:26 ??ٮ?e?
uatusr01@tst10:/uniiof/uatusers/uatusr01>

第一列则为 inode 号。

结合 inode 号,使用 find 将文件删除:

1
2
3
uatusr01@tst10:/uniiof/uatusers/uatusr01>find . -maxdepth 1 -inum 60034634 -delete
uatusr01@tst10:/uniiof/uatusers/uatusr01>find . -maxdepth 1 -inum 60034635 -delete
uatusr01@tst10:/uniiof/uatusers/uatusr01>

如果文件较多,可以提取 inode 号,写个循环进行删除,这里就不再多说。