如何列出目录中最近删除的文件?

14

我甚至不确定这是否容易实现,但我想列出最近从目录中删除的文件(如果可能,递归地)。

我正在寻找一种解决方案,它不需要创建包含原始目录结构快照的临时文件来进行比较,因为可能并不总是有写入权限。编辑:如果可以通过将快照存储在shell变量而不是文件中来实现相同的结果,那就可以解决我的问题。

类似这样的东西:

find /some/directory -type f -mmin -10 -deletedFilesOnly

编辑:操作系统:我使用的是Ubuntu 14.04 LTS,但是命令很可能在各种Linux盒子或Docker容器中运行,其中大多数或全部应该使用ext4,我很可能无法访问以进行修改。


5
在Linux中,已删除的文件是真正被删除的——没有内置的安全措施。如果你想尝试一些非常高级的操作,可以尝试这个链接:http://unix.stackexchange.com/questions/80270/unix-linux-undelete-recover-deleted-files ...但对于你似乎需要的东西来说,那可能有点过头了。 - kittykittybangbang
我能想到的唯一可能就是,如果这个文件被编辑后并且保留了备份,并且在一个目录中搜索任何一个名为foo.bar~的文件,但是在该目录中没有foo.bar文件,从而假设文件已被删除。 - jgr208
2
答案取决于所使用的文件系统,而不是操作系统本身。与Linux唯一相关的是,对于大多数流行的Linux文件系统来说,您所要求的是不可能的。 - Alex P.
但是对于大多数在Linux上使用CLI界面看到的文件系统,这几乎是不可能的。那么您可以告诉我们您正在使用哪个Linux操作系统吗? - jgr208
5个回答

17

您可以使用debugfs实用程序,

debugfs是一个简单易用、专门设计用于调试的基于RAM的文件系统。

首先,在终端中运行debugfs /dev/hda13(将/dev/hda13替换为您自己的磁盘/分区)。

(注意:您可以通过在终端中运行df /来查找您的磁盘名称。)

进入调试模式后,您可以使用命令lsdel列出与已删除文件对应的inode。

当在Linux中删除文件时,它们仅被取消链接,但它们的inode(实际存在文件的磁盘地址)未被删除。

要获取这些已删除文件的路径,您可以使用debugfs -R "ncheck 320236"命令,将数字替换为您特定的inode。

Inode   Pathname
320236  /path/to/file

您可以使用 cat 命令查看已删除文件的内容。(注意:必要时您也可以从这里恢复文件)。

关于此问题的精彩帖子,请访问这里


1
“lsdel” 显示已删除文件的 inode;有没有办法查看已删除文件的名称? - chepner
我不确定是否有一种方法可以输出所有文件名,但是您可以使用“cat”命令检索文件的内容。像这样,“cat <32611>”,将数字替换为您想要检查的inode。 - nextstep
1
这只是提供了一个未知文件集的内容。问题要求查找已删除文件的身份,而不是它们的内容。 - chepner
编辑以解释如何检索已删除文件的文件名。 - nextstep
不幸的是,在我的情况下,这并没有起作用。我在LVM上使用了XFS。 - b10n1k

2

有几点需要注意:

  1. 如果您的分区是ext2,则可能完全无法成功;它最适合使用ext4。

  2. df /

  3. 将结果填充到挂载点中,例如我的情况:

    sudo debugfs /dev/mapper/q4os--desktop--vg-root

  4. lsdel

  5. 按q退出debugfs

  6. sudo debugfs -R 'ncheck 528754' /dev/sda2 2>/dev/null(使用步骤#4中的数字进行替换)


由于您正在正式回答一个较旧的问题,最好您能够使用一些代码以及使用该代码产生的输出来支持您所谓的答案。尝试复制和粘贴一些结果,甚至可以使用演示代码的屏幕截图。 - Gray

0

感谢大家的评论和答案。 debugfs 似乎是最初需求的一个有趣解决方案,但对于我寻找的简单轻量级解决方案来说有点过度杀伤力;如果我理解正确,内核必须使用 debugfs 支持构建,并且目标目录必须在 debugfs 挂载中。不幸的是,这对我的用例并不适用;我必须能够为现有的“基本”内核和目录提供解决方案。

由于这似乎几乎不可能实现,因此我已经成功地协商并放宽了要求,仅列出从目录中最近删除的文件的数量,如果可能的话进行递归。

这是我最终实施的解决方案:

  1. 将一个简单的 find 命令导入到 wc 中以计算目标目录(递归)中原始文件数。结果可以轻松地存储在 shell 或脚本变量中,而无需对文件系统进行写访问。

DEL_SCAN_ORIG_AMOUNT=$(find /some/directory -type f | wc -l)

  1. 我们可以稍后再次运行相同的命令以获取更新后的文件数量。

DEL_SCAN_NEW_AMOUNT=$(find /some/directory -type f | wc -l)

  1. 然后,我们可以将两者之间的差异存储在另一个变量中,并更新原始数量。

DEL_SCAN_DEL_AMOUNT=$(($DEL_SCAN_ORIG_AMOUNT - $DEL_SCAN_NEW_AMOUNT)); DEL_SCAN_ORIG_AMOUNT=$DEL_SCAN_NEW_AMOUNT

  1. 如果文件数量减少了,我们可以打印一个简单的消息。

if [ $DEL_SCAN_DEL_AMOUNT -gt 0 ]; then echo "$DEL_SCAN_DEL_AMOUNT deleted files"; fi;

  1. 返回第2步。

不幸的是,如果在一个时间间隔内创建和删除了相同数量的文件,这个解决方案将不会报告任何内容,但对于我的用例来说,这并不是一个 巨大 的问题。

为了避免这种情况,我需要存储实际的文件列表而不是数量,但我无法使用 shell 变量使其工作。如果有人能够解决这个问题,那么这将极大地帮助我满足最初的要求!

我还想知道是否有人对这两种方法有评论。


0

尝试:

lsof -nP | grep -i deleted

1
抱歉,这并没有回答原问题。lsof命令只列出打开的文件;如果这些文件已被删除,则它们目前不会处于打开状态。(可能有一个微小的例外,即如果一个进程打开了一个文件,另一个进程删除了该文件。) - Mark Stewart

-2

历史记录 >> history.txt

查找所有的rm语句。


1
除了使用“rm”语句之外,还有许多其他方法可以删除文件。 - Marco Roy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接