最近,我正在编写一个bash命令行脚本来维护特定文件夹的大小。 请注意,有些程序有时在这个文件夹中写入/更新文件,所以一个“全部”的rm -rf将永远不适合这种情况。
我能够检索所有“活动”,换句话说,使用lsof打开文件,并用awk打印出来:
lsof +D ./ | awk ' { print ( $NF ) } '
这给了我一个打开的文件列表,我显然不想摆脱它们。 不过,我想删除其余的。
我希望在rm命令中有一个选项可以使用^选项排除某些文件…
有没有办法在bash中实现这一点?
非常感谢。
首先确保你有extglob
:
shopt -s extglob
然后删除lsof
没有列出的所有文件:
DONT_RM=`lsof +D \. | awk '{ print $NF; }' | tr "\\n" "|" | sed 's/\.\///g'` && rm !($DONT_RM)
打破以上,我们加入管道|
的lsof
的结果 而不是换行符\n
并从文件名的开头删除./
。 然后我们把这个OR文件列表传递给rm !
extglob选项。 试试看,它在我的基本测试中起作用。
这可以在没有临时文件的情况下在一行上完成,但是我将它分开来使注释和调试更容易:
# 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)
请注意,这不是白色空间安全。