如何找到未被任何进程使用的文件并将其删除?

如何找到未被任何进程使用的文件并将其删除?

我发现~/.wine/drive_c/users/t/Temp/有1.4G字节的文件*.tmp。其中一些正在被某些进程使用(我可以通过 来区分每个文件lsof),而另一些则没有被任何进程使用。

该目录下的文件是否临时存储Wine客户端进程使用的信息?

这些文件可以安全删除吗?

如果我只能删除那些未被任何 wine 客户端进程使用的文件,我该如何编写一个可以自动查找此类文件并删除它们的命令?

谢谢。

答案1

删除文件不受 Wine 的控制,在 unix 中您可以删除打开文件的目录条目。该文件将一直保留到使用该文件的进程将其关闭为止。

做你想做的事情,选择当前未打开的文件,以便你可以随心所欲地处理它们,这是你查看和处理打开和关闭(可能还创建和删除)它们之间的一场竞赛。避免这种竞争是大型机作业输入子系统和作业控制语言的职责。但是,如果“通常是最近的”对您来说足够接近当前,请列出所有文件,列出所有打开的文件,任何未列出两次的文件在您查看时都存在,但在您几乎同时查看时未打开(或者是当你查看时打开,但当你几乎同时查看时不存在,这就是我在这里首先执行 lsof 的原因)。

在 GNU/任何东西上,

sort -r <<EOD | uniq -u | while read; do test -f "$REPLY" && echo rm "${REPLY@Q}"; done
$( cd targetdir
   lsof -Fn +D $PWD | sed -n /^n/s/.//p
   find $PWD -printf %p\\n
)
EOD

将吐出命令列表来删除看起来可以安全删除的文件。

但通常您只需在启动时擦除临时目录,并对最新文件进行一些保护,

find $TMPDIR -ctime +6 -delete

例如,删除至少一周前制作的所有内容。

答案2

zsh

echo rm -f ~/.wine/drive_c/users/t/Temp/*(D.^e['fuser -s $REPLY'])

(快乐的时候去掉echo

这会删除未 ( ) 找到任何文件的常规文件 ( .) (包括隐藏文件 ( D))fuser^用户过程。

如果您想递归地执行此操作,请替换***/*,或者您也可以使用find

find ~/.wine/drive_c/users/t/Temp -type f ! -exec fuser -s {} \; \
   -exec echo rm -f {} +

(如果您的实现支持,请替换-exec rm -f {} +为)。-deletefind

相关内容