当一个目录中的内容过多时,文件的清理将成为一个麻烦的事情,比较常见的就是 Oracle 的 audit 目录 和 trace 目录。
这儿记录两种方法,各有利弊,可根据实际情况选择。
方法一:文件逐个判断,然后删除
进入要处理的目录,先使用类似命令生成文件列表文件:ls -t | grep aud > cfop.cy
将如下内容写到一个脚本,直接 sh script_name.sh 即可
while read filename; do
checkuse=`fuser -u $filename 2>&1 | awk -F: '{print $2}' | grep '(' | wc -l | awk '{print $1}'`
if [ $checkuse -ne 0 ]; then
echo "$filename is using..."
else
echo "$filename is not using...removed"
rm $filename
fi
done < cfop.cy
方法二:文件批量快速删除
思想:将正在使用的文件找出来,使用 find 命令查找目录下的文件并删除(排除在用的文件)
运行脚本的方法:只需要修改目录和 find 的文件名匹配
auditdir='/data/app/18.3.0/grid/rdbms/audit'
# using audit file
lsof | grep "${auditdir}/" | awk '{print $NF}' | grep -v deleted | awk -F/ '{print $NF}' | sort | uniq > /tmp/auditfile.using.tmp
# delete audit file
export filestring=$(sed ':a ; N;s/\n/ -a ! -name / ; t a ; ' /tmp/auditfile.using.tmp)
if [ -z "${filestring}" ];then
cd ${auditdir}
find ./ -type f -a -name "*.trc" | xargs rm -f
find ./ -type f -a -name "*.trm" | xargs rm -f
find ./ -type f -a -name "*.aud" | xargs rm -f
else
cd ${auditdir}
find ./ -type f -a -name "*.trc" -a ! -name ${filestring} | xargs rm -f
find ./ -type f -a -name "*.trm" -a ! -name ${filestring} | xargs rm -f
find ./ -type f -a -name "*.aud" -a ! -name ${filestring} | xargs rm -f
fi