如何使用 find 命令列出未打开的文件

如何使用 find 命令列出未打开的文件

我想使用 GNU find 命令“列出”某个目录中所有未打开的文件。现在,我可以列出已打开的文件,但找不到相反的方法。

find /my/dir/* -exec lsof {} \;  

有什么想法可以做到这一点吗?

答案1

find /my/dir -type f | while read filename ; do fuser -s $filename || echo $filename ; done

这仅使用 find 来生成文件列表。然后 while 循环遍历结果列表,对每个结果运行该循环,fuser -s $filename如果有某个文件正在使用,则循环将成功退出。

|| echo $filename部分的意思是“如果 fuser 失败(意味着没有人使用该文件),则回显文件名”

答案2

这是我使用的

$ find . ! -exec sudo fuser -s "{}" 2>/dev/null \; -exec echo {} \;

它使用了两个巧妙的功能find

  • execs 被链接在一起,类似于 bash 操作&&。如果第一个 exec 返回非零退出代码,则不会调用第二个 exec。
  • !是退出代码的逆运算。fuser表示文件未访问则返回 1,表示文件访问则返回 0,所以我们需要将其翻转才能得到您想要的结果。

请注意,我已将 a 添加sudo到 fuser,以便它可以找到其他用户打开的文件。如果没有这个,它会很高兴地报告文件未打开,而实际上它只是报告该文件未被您有权限监控的进程打开

另外值得一提的是 - 显然调用 fuser 比仅仅检查 inode 信息更昂贵,所以如果你除了“这是一个打开的文件吗”之外还有一些你关心的其他过滤器,你应该先将这些过滤器应用于 find,然后再进行更昂贵的 fuser 检查

相关内容