最近我正在编写一个bash命令行脚本来维护特定文件夹的大小。请注意,有些程序有时会在此文件夹中编写/更新文件,因此“全能”rm -rf永远不适合这种情况。
我能够检索所有“活动”,换句话说,使用lsof打开文件并使用awk打印出来:
lsof +D ./ | awk ' { print ( $NF ) } '
这给了我一个打开文件的列表,我显然不想摆脱它们。但是我想删掉其余部分。
我希望rm命令中有一个选项可以使用^选项...
排除某些文件有没有办法在bash中实现这个目标?
提前多多感谢。
答案 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。尝试一下,它适用于我的基本测试。