Bash 脚本不断删除文件,直到目录大小小于 X

use*_*613 4 bash debian

我正在尝试编写一个脚本来不断从文件夹 (/home/folder) 中删除文件,直到主目录 (/home/) 大小小于 X GB。该脚本应一次删除 25 个文件,这些文件应该是目录中最旧的文件。然而,我是一个菜鸟,我想不出各种各样的循环。相反,我在下面写了几次相同的脚本行;它有效,但我希望有一个更好的循环。你能用更优雅、更有效的方式帮助我吗?

size=$(du -shb /home/ | awk '{print $1}')
if [ "$size" -gt X ]; then
find /home/folder -maxdepth 1 -type f -printf '%T@\t%p\n' | sort -r | tail -n 25 | sed 's/[0-9]*\.[0-9]*\t//' | xargs -d '\n' rm -f
sleep 30
else
exit
fi
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 5

不错!让它循环的最简单方法就是在它周围添加一个无限循环。您的 exit 语句将退出脚本,因此显然也会退出循环:

while true
do
  size=$(du -shb /home/ | awk '{print $1}')
  if [ "$size" -gt X ]; then
    find /home/folder -maxdepth 1 -type f -printf '%T@\t%p\n' | sort -r | tail -n 25 | sed     's/[0-9]*\.[0-9]*\t//' | xargs -d '\n' rm -f
    sleep 30
  else
    exit  # <- Loop/script exits here
  fi
done
Run Code Online (Sandbox Code Playgroud)

您还可以重写逻辑以使其更漂亮:

while [ "$(du -shb /home/ | awk '{print $1}')" -gt X ]
do
  find /home/folder -maxdepth 1 -type f -printf '%T@\t%p\n' | \
      sort -n | head -n 25 | cut -d $'\t' -f 2-  | xargs -d '\n' rm -f
done
Run Code Online (Sandbox Code Playgroud)

您还可以将其重写为不重复迭代/home,从而允许您删除单个文件而不是 25 个块:

usage=$(du -sb /home | cut -d $'\t' -f 1)
max=1000000000
if (( usage > max ))
then
  find /home/folder -maxdepth 1 -type f -printf '%T@\t%s\t%p\n' | sort -n | \
    while (( usage > max )) && IFS=$'\t' read timestamp size file
    do
      rm -- "$file" && (( usage -= size ))
    done
fi
Run Code Online (Sandbox Code Playgroud)