我想使用 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
:
exec
s 被链接在一起,类似于 bash 操作&&
。如果第一个 exec 返回非零退出代码,则不会调用第二个 exec。!
是退出代码的逆运算。fuser
表示文件未访问则返回 1,表示文件访问则返回 0,所以我们需要将其翻转才能得到您想要的结果。
请注意,我已将 a 添加sudo
到 fuser,以便它可以找到其他用户打开的文件。如果没有这个,它会很高兴地报告文件未打开,而实际上它只是报告该文件未被您有权限监控的进程打开
另外值得一提的是 - 显然调用 fuser 比仅仅检查 inode 信息更昂贵,所以如果你除了“这是一个打开的文件吗”之外还有一些你关心的其他过滤器,你应该先将这些过滤器应用于 find,然后再进行更昂贵的 fuser 检查