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

时间:2013-03-04 22:40:49

标签: linux bash command-line

最近我正在编写一个bash命令行脚本来维护特定文件夹的大小。请注意,有些程序有时会在此文件夹中编写/更新文件,因此“全能”rm -rf永远不适合这种情况。

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

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

这给了我一个打开文件的列表,我显然不想摆脱它们。但是我想删掉其余部分。

我希望rm命令中有一个选项可以使用^选项...

排除某些文件

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

提前多多感谢。

2 个答案:

答案 0 :(得分:4)

这可以在没有临时文件的情况下在一行上完成,但我会将其拆分以使评论和调试更容易:

# 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)

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

答案 1 :(得分:1)

首先确保您有extglob

shopt -s extglob

然后删除lsof中未列出的所有文件:

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

分解上述内容,我们将lsof的结果与管道|结合,而不是换行符\n,并从文件名的开头删除前缀./ 。然后我们将这个OR文件列表作为非! extglob选项传递给rm。尝试一下,它适用于我的基本测试。