Linux Bash脚本,如果可用大小超过阈值,则从目录中递归删除最旧的文件

Linux Bash脚本,如果可用大小超过阈值,则从目录中递归删除最旧的文件,linux,bash,shell,ubuntu,Linux,Bash,Shell,Ubuntu,我正在寻找一个脚本,如果分区上的可用空间小于5%,它将从目录中删除文件(最旧的优先) 我找到了以下脚本: FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor CAPACITY=95 # delete if FS is over 95% of usage CACHEDIR=/home/user/lotsa_cache_files/ # Proceed if filesystem capacity is over than the v

我正在寻找一个脚本,如果分区上的可用空间小于5%,它将从目录中删除文件(最旧的优先)

我找到了以下脚本:

FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor
CAPACITY=95 # delete if FS is over 95% of usage 
CACHEDIR=/home/user/lotsa_cache_files/

# Proceed if filesystem capacity is over than the value of CAPACITY (using df POSIX syntax)
# using [ instead of [[ for better error handling.
if [ $(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }') -gt $CAPACITY ]
then
    # lets do some secure removal (if $CACHEDIR is empty or is not a directory find will exit
    # with error which is quite safe for missruns.):
    find "$CACHEDIR" --maxdepth 1 --type f -exec rm -f {} \;
    # remove "maxdepth and type" if you want to do a recursive removal of files and dirs
    find "$CACHEDIR" -exec rm -f {} \;
fi 
据我所知,如果$FILESYSTEM上使用的空间超过$CAPACITY%,它将从CACHEDIR中删除文件

不过,我不确定这是否有效,但我肯定它不会先删除最旧的


我希望它删除最小数量的文件(从最旧到最新),以便释放空间。

如果/dev/sda1已满95%,脚本将删除
$CACHEDIR
中的每个文件。 这样做:

#!/bin/bash

DIRECTORY="/path/to/your/directory"
CAPACITY=95
while [[ $(df $DIRECTORY | awk 'NR==2 && gsub("%","") {print$5}') -ge $CAPACITY ]];do
        rm -rf $(find $DIRECTORY -mindepth 1 -printf '%T+ %p\n' | sort | awk 'NR==1 {print$2}')
done
您可以在crontab上运行此脚本,或者执行while循环并使用systemd对其进行后台监控,以便它在每次分区达到95%时都能在后台运行并删除文件

解释:

df$DIRECTORY
跟踪目录分区并打印其信息。
awk'NR==2&&gsub(“%”,“){print$5}”
打印第二行(相关行,第一行是标题),删除百分号并打印第5列(“使用%”列)。
rm-rf
删除以下命令的结果。

find$DIRECTORY-mindepth 1-printf“%T+%p\n”| sort | awk'NR==1{print$2}
找到
$DIRECTORY
并打印文件的修改日期,然后对其进行排序并只打印第一行(最早的一行)的第二个字段(文件名).

如果/dev/sda1已满95%,脚本将删除
$CACHEDIR
中的每个文件。 这样做:

#!/bin/bash

DIRECTORY="/path/to/your/directory"
CAPACITY=95
while [[ $(df $DIRECTORY | awk 'NR==2 && gsub("%","") {print$5}') -ge $CAPACITY ]];do
        rm -rf $(find $DIRECTORY -mindepth 1 -printf '%T+ %p\n' | sort | awk 'NR==1 {print$2}')
done
您可以在crontab上运行此脚本,或者执行while循环并使用systemd对其进行后台监控,以便它在每次分区达到95%时都能在后台运行并删除文件

解释:

df$DIRECTORY
跟踪目录分区并打印其信息。
awk'NR==2&&gsub(“%”,“){print$5}”
打印第二行(相关行,第一行是标题),删除百分号并打印第5列(“使用%”列)。
rm-rf
删除以下命令的结果。

find$DIRECTORY-mindepth 1-printf'%T+%p\n'| sort | awk'NR==1{print$2}
找到
$DIRECTORY
并打印文件的修改日期,然后对其排序并只打印第一行(最早的一行)的第二个字段(文件名)。

使用ls获取要删除的文件如何

FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor
CAPACITY=95 # delete if FS is over 95% of usage 
CACHEDIR=/home/user/lotsa_cache_files/

# Proceed if filesystem capacity is over than the value of CAPACITY (using df POSIX syntax)
# using [ instead of [[ for better error handling.
if [ $(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }') -gt $CAPACITY ]
then
    # Remove the oldest file in CACHEDIR:
    # rm $CACHEDIR/$( ls -t $CACHEDIR | tail -1 )
    rm $CACHEDIR/$( ls -tp $CACHEDIR | sed '/\/$/d' | tail -1 )
fi 

使用ls获取要删除的文件怎么样

FILESYSTEM=/dev/sda1 # or whatever filesystem to monitor
CAPACITY=95 # delete if FS is over 95% of usage 
CACHEDIR=/home/user/lotsa_cache_files/

# Proceed if filesystem capacity is over than the value of CAPACITY (using df POSIX syntax)
# using [ instead of [[ for better error handling.
if [ $(df -P $FILESYSTEM | awk '{ gsub("%",""); capacity = $5 }; END { print capacity }') -gt $CAPACITY ]
then
    # Remove the oldest file in CACHEDIR:
    # rm $CACHEDIR/$( ls -t $CACHEDIR | tail -1 )
    rm $CACHEDIR/$( ls -tp $CACHEDIR | sed '/\/$/d' | tail -1 )
fi 

还不确定是否要找到最老的,但您的
if
无法工作。
awk
语句需要稍微更改
awk'FNR==2{gsub(……
需要添加
FNR==2
不确定是否要查找最旧的,但如果
无法运行,则您的
将无法运行。
awk
语句需要更改一点。
awk'FNR==2{gsub(……
需要添加
FNR==2
Marcos,谢谢你的建议。NR==2是什么?我的意思是,那是什么语法,我是什么语言?顺便说一句,如果目录不存在。它不会开始从当前目录中删除文件吗?谢谢Marcos。mindepth 1呢,为什么会出现?如果脚本没有权限删除,会发生什么me文件?它会挂在无限循环中吗?NR是awk处理的记录(行)数的awk语法。在这种情况下,它将打印第二行(NR==2)。请参阅说明。在此脚本中,它将打印第二行的第五个字段,即“Use%”在df.和DIRECTORY变量中,您必须指定一个有效目录,否则它将从当前目录中删除文件。您可以这样增强它:如果[[-z$DIRECTORY]]| |[!-d$DIRECTORY]];然后回显“指定有效目录”;退出1;fiWow,删除目录中的文件之外的其他文件听起来很危险。Marcos,谢谢你的建议。NR==2是什么?我的意思是,那是什么语法,我是什么语言?顺便说一句,如果目录不存在。它不会从当前目录中删除文件吗?谢谢Marcos。mindepth 1呢,为什么在那里?如果脚本没有删除某些文件的权限?它会挂起在无限循环中吗?NR是awk处理的记录(行)数的awk语法。在这种情况下,它正在打印第二行(NR==2)。请参阅说明。在此脚本中,它将打印第二行的第五个字段,即“Use%”在df.和DIRECTORY变量中,您必须指定一个有效目录,否则它将从当前目录中删除文件。您可以这样增强它:如果[[-z$DIRECTORY]]| |[!-d$DIRECTORY]];然后回显“指定有效目录”;退出1;fiWow,删除目录中的文件以外的其他文件听起来很危险。我不知道在使用ls时有什么方法可以排除目录。此外,我相信您的命令每行可能会获得多个文件。第一点,您是对的,我为此添加了一个筛选器。但是,不,您不会每行获得多个文件。
ls
命令可识别输出是否为控制台(因为它需要知道终端有多少列),并且每行只打印一个。我不知道在使用ls时有什么方法排除目录。此外,我相信您可以使用命令在每行中获得多个文件。第一点,您是对的,我为此添加了一个筛选器。但是,不,您不会在每行中获得多个文件。
ls
命令可以识别何时输出为不是控制台(因为它需要知道终端有多少列),每行只打印一列。