我尝试编写脚本以保持从文件夹(/ home /文件夹)中删除文件,直到主目录(/ 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
答案 0 :(得分:3)
还不错!使其循环的最简单方法是简单地在其周围添加无限循环。你的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
您还可以重写逻辑以使其更漂亮:
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
你也可以将其重写为不反复迭代/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
答案 1 :(得分:0)
如果您正在寻找与BusyBox兼容的脚本:
DIRECTORY=$1
MAX_SIZE_MB=$2
KB_TO_MB=1000
MAX_SIZE_KB=$(($MAX_SIZE_MB*$KB_TO_MB))
if [ ! -d "$DIRECTORY" ]
then
echo "Invalid Directory: $DIRECTORY"
exit 1
fi
usage=$(du -s $DIRECTORY | awk '{print $1}')
echo "$DIRECTORY - $(($usage/$KB_TO_MB))/$MAX_SIZE_MB MB Used"
if (( usage > $MAX_SIZE_KB ))
then
#https://stackoverflow.com/questions/1447809/awk-print-9-the-last-ls-l-column-including-any-spaces-in-the-file-name
files=($(find $DIRECTORY -maxdepth 1 -type f -print| xargs ls -lrt | sed -E -e 's/^([^ ]+ +){8}//'))
for file in ${files[@]};
do
size=$(du -s "$file" | awk '{print $1}')
rm -f "$file"
((usage -= size))
if (( $usage < $MAX_SIZE_KB ))
then
break
fi
done
fi