删除lsof在文件夹中未列出的所有文件

问题描述:

最近,我正在编写一个用于维护特定文件夹大小的bash命令行脚本。请注意,有些程序有时会在此文件夹内写入/更新文件,因此“全部捕获”rm -rf将永远不适合这种情况。删除lsof在文件夹中未列出的所有文件

我能够检索所有的“活动”,换句话说,打开的文件使用lsof的,并把它们打印出来使用awk:

lsof +D ./ | awk ' { print ($NF) } ' 

这给了我这些打开的文件列表,我明明DON 'T想摆脱他们。不过,我想删除其余的。

我希望有在rm命令的选项排除使用^选择一些文件...

有没有办法在bash实现这一目标?

非常感谢。

+0

为什么你不想删除打开的文件?它们不会对打开句柄的程序造成任何问题(它们将能够读取和/或写入,就好像它们仍然存在一样),并且这些空间将在关闭它们时自动回收。 – Cairnarvon 2013-03-04 22:53:06

+0

@Cairnarvon因为这些文件是用于记录/追踪的目的,并且按照业务规则,我们应该保持它们完好无损。 – 2013-03-04 22:54:22

+1

您应该清楚地将这些文件列入白名单,而不是希望在清理文件夹时没有意外关闭您的进程。 – Cairnarvon 2013-03-04 23:44:34

首先确保你有extglob

shopt -s extglob 

接着删除lsof未列出的所有文件:打破上述情况,我们要加入的lsof与管道结果

DONT_RM=`lsof +D \. | awk '{ print $NF; }' | tr "\\n" "|" | sed 's/\.\///g'` && rm !($DONT_RM) 

|而不是换行符\n,并从文件名的开头删除前面的./。然后我们将这个OR列表传递给rm,作为不是! extglob选项。试试看,它在我的基本测试中起作用。

+0

真的很好的工作在一线!非常感谢,在演示中选择了一些有用的技巧。 – 2013-03-05 02:25:54

这可以在没有临时文件一行来完成,但我会分裂它做出注释和调试更加容易:

# Get a sorted list of used files 
lsof +D ./ | awk ' { print ($NF) } ' | sort | uniq > usedFiles 

# Get a sorted list of existing files 
find ./ | sort > existingFiles 

# Find lines unique to existingFiles 
comm -23 existingFiles usedFiles > removableFiles 

# Delete them 
rm $(< removableFiles) 

请注意,这不是空白的安全。

+0

emmm我也用bash脚本的方式制定出来了。我正在使用for循环并测试此目录中的每个文件,如果它未打开,请将其删除。 – 2013-03-04 23:39:01