如果使用rm -rf
指令删除了某个问价夹,比如:
1 | rm -rf importantFile |
删完之后发现这个文件夹里面的内容都是有用的,这时候先不要慌张,可以使用lsof | grep FileName
指令查看是否有进程在使用这个文件,如果可以找到,就可以使用如下的解决方案,如果没有找到,那么就需要借助于其它的工具解决了。
比如我的操作:
1 | [work(mike)@tjtxvm-224-15 web]$ lsof | grep importantFile |
从中我们可以看出java进程在使用这些文件,并且这个进程的进程号是:16941。我们可以进入该进程的文件描述符目录中查看它都使用了哪些文件描述符(fd是file descriptor的缩写):
1 | [work(mike)@tjtxvm-224-15 web]$ cd /proc/16941/fd |
这些就是文件描述符,但是从中我们看不到其所指的具体文件,可以使用ll指令查看描述符的详细信息,同时,如果想要过滤出和某个目录相关的信息可以结合grep指令。
查询所有被删除的文件:
1 | [work(mike)@tjtxvm-224-15 fd]$ ll | grep importantFile |
从中可以看到文件最后的括号中有一个deleted的标示。其实我们只要使用cp指令把相应的描述符拷贝到相应的文件即可:
1 | cp FdNumber DestinationFile |
但因为这时DestinationFile
这个文件的所有目录都被我们删除了,所以不能用直接用cp指令来做这件事,需要使用如下的脚本:
1 | test -d "$des" || mkdir -p "$des" && cp $src $des |
这里第一个参数是原文件,第二个参数是目标文件以及其路径。这样我们就可以通过循环来获取每个文件的描述符和其目标地址来进行恢复,所有的代码如下(脚本的地址):
1 | # |