linux下如何不依赖文件名删除文件的方法有哪些
在 Linux 下,可以不依赖文件名删除文件,常见有以下几种方法,具体取决于手上有什么信息。
方法一:根据 inode 删除(最常用)
如果文件名乱码、包含特殊字符、或者无法输入文件名,可以根据 inode 删除。
1. 查看 inode
ls -li
例如:
1234567 -rw-r--r-- 1 root root 1024 Jul 1 test.txt 7654321 -rw-r--r-- 1 root root 2048 Jul 1 ????.txt
其中
7654321
就是 inode。
2. 根据 inode 删除
find . -inum 7654321 -delete
或者
find . -inum 7654321 -exec rm {} \;如果是在整个文件系统:
find / -xdev -inum 7654321 -delete
-xdev 可以避免跨文件系统搜索。
方法二:根据文件描述符删除(文件已经打开)
如果程序已经打开了文件,即使文件名不知道,也可以利用 /proc。
例如:
lsof
输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME myapp 1234 root 5u REG 8,1 2048 7654321 /tmp/abc
可以看到:
PID = 1234 FD = 5
删除:
rm /proc/1234/fd/5
实际上这是删除对应文件的链接(如果还有其他硬链接则不会真正释放数据)。
方法三:根据路径但不用输入文件名
例如文件名很长:
find /tmp -type f -size +100M -delete
或者
find . -type f -mtime +30 -delete
根据:
- 大小
- 时间
- inode
- 权限
- 属主
等条件删除。
方法四:使用 shell 的 inode(极少见)
假设目录下只有一个 inode:
find . -maxdepth 1 -inum 7654321 -exec unlink {} \;这里:
unlink
直接调用系统调用删除目录项。
方法五:利用硬链接
如果知道 inode,可以先找到对应路径:
find / -inum 7654321
输出:
/home/test/abc
然后:
unlink /home/test/abc
方法六:根据设备号 + inode(恢复工具常用)
一些恢复工具(例如 debugfs)可以直接操作 inode:
debugfs /dev/sda1
进入后:
stat <7654321>
或者
clri <7654321>
注意: clri 会直接清除 inode,而不是正常删除文件,可能导致文件系统损坏或数据丢失,仅适用于文件系统修复等特殊场景,不建议日常使用。
为什么 inode 可以删除文件?
Linux 删除文件,本质上删除的是目录项(directory entry),目录项保存的是:
文件名 ---> inode
文件名只是一个索引,真正代表文件的是 inode。
因此:
文件名A
\
--> inode1234
/
文件名B多个文件名(硬链接)可以指向同一个 inode。
当执行:
rm 文件名A
实际上只是删除:
文件名A -> inode1234
只有当:
- 硬链接数(link count)变为 0;并且
- 没有任何进程仍打开该文件;
文件的数据块才会被真正释放。
最推荐的方法
对于绝大多数场景(例如文件名乱码、包含不可打印字符、无法直接输入文件名),根据 inode 删除是最安全、最方便的做法:
# 查看 inode ls -li # 删除指定 inode 的文件 find . -inum <inode号> -delete
这是 Linux 系统管理员最常用的无文件名删除方式。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
linux 可执行文件与写操作的同步问题(文件读写操作产生的锁机制)
在哪种系统下都会有文件操作产生的同步问题,今天说说linux下读写文件的锁机制。2013-10-10
函数sync、fsync与fdatasync的总结整理(必看篇)
下面小编就为大家带来一篇函数sync、fsync与fdatasync的总结整理(必看篇)。小编觉得挺不错的。现在就分享给大家。也给大家做个参考。一起跟随小编过来看看吧2016-12-12
linux或windows环境下pytorch的安装与检查验证(解决runtimeerror问题)
这篇文章主要介绍了linux或windows环境下pytorch的安装与检查验证(解决runtimeerror问题),需要的朋友可以参考下2019-12-12


最新评论