查找并删除大于 2G 且可用空间小于 X 的文件

查找并删除大于 2G 且可用空间小于 X 的文件

如何根据以下规则删除位于挂载点下名为stdout/ 的文件?stderr/data/sdf

  1. 可用磁盘空间(上/dev/sdf)小于100G

  2. stdout或文件stderr大小大于2G

    /data/sdf/hadoop/yarn/log/application_1575355124522_0458/container_e245_1575355124522_0458_01_000002/stdout
    /data/sdf/hadoop/yarn/log/application_1575355124522_0458/container_e245_1575355124522_0458_03_000002/stdout
    /data/sdf/hadoop/yarn/log/application_1515153382036_0001/container_e13_1515153382036_0001_02_000003/stdout    
    

df -h

/dev/sdf                   80G   76G  3.7G  82% /data/sdb

我提出了以下find调用来根据文件的大小删除文件,

find /grid/sdf -type f \( -name "stdout" -o -name "stderr" \) -size +2000M -delete

但不知道如何检查可用磁盘空间。

答案1

假设 GNU df,您可以使用例如添加可用磁盘空间的条件

[[ $(df --output=avail -B1 /grid/sdf | tail -n 1) -lt 100*1024*1024*1024 ]] && \
find /grid/sdf -type f \( -name "stdout" -o -name "stderr" \) -size +2000M -delete

您可以根据需要进行调整,例如只要可用空间小于 100 GiB 即可删除文件:

while [[ $(df --output=avail -B1 /grid/sdf | tail -n 1) -lt 100*1024*1024*1024 ]]; do
    find /grid/sdf -type f \( -name "stdout" -o -name "stderr" \) -size +2000M -delete -quit
done

(请注意,如果删除这些文件没有释放足够的空间,这将无限循环。)

除了 之外df,您还可以使用findmnt: 替换df --output=avail -B1 /grid/sdf | tail -n 1findmnt -nbo AVAIL /grid/sdf(不需要tail)。

相关内容