Linux

查找 + 刪除大於 2G 且可用空間小於 X 的文件

  • February 4, 2020

如何根據以下規則刪除位於掛載點下的名為stdout/的文件?stderr``/data/sdf

  1. 可用磁碟空間(on /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

但不知道如何也檢查可用磁碟空間。

假設 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)。

引用自:https://unix.stackexchange.com/questions/565696