我想使用GNU find命令“列出”所有未打开的文件。 现在,我可以列出打开的文件,但无法find一种方法来做相反的处理。
find /my/dir/* -exec lsof {} \;
任何想法如何做到这一点?
find /my/dir -type f | while read filename ; do fuser -s $filename || echo $filename ; done
这使用查找只是为了生成一个文件列表。 然后,while循环遍历结果列表,对于每个运行的结果,它将运行fuser -s $filename ,如果某些内容正在使用该文件,将会成功退出。
|| echo $filename || echo $filename部分的意思是“如果fuser失败(意思是没有人使用该文件),echo文件名”
这是我使用的
$ find . ! -exec sudo fuser -s "{}" 2>/dev/null \; -exec echo {} \;
它使用了两个很好的findfunction:
exec链接在一起,类似于bash操作&& 。 如果第一个exec返回一个非零的退出代码,那么第二个exec不会被调用。 ! 是退出代码的逆操作。 fuser返回1表示没有访问的文件,0表示文件访问,所以我们需要翻转它来得到你想要的。 请注意,我已经添加了一个sudo到fuser,以便它可以find其他用户打开的文件。 如果没有这个,它会高兴地报告文件没有打开,而实际上它只是报告文件不是由您有权监视的进程打开
另外值得一提的是,显然调用fuser比仅仅检查inode信息更加昂贵,所以如果除了“这是一个打开的文件”之外还有其他一些你关心的filter,你应该先把这些filter应用到find更昂贵的定影器检查