Contents

计算文件然后删除最旧文件的脚本

1. 概述

在本教程中,我们将创建一个 bash 脚本来计算目录中的文件,如果文件多于特定数量,它将删除最旧的文件。

2. 环境

假设我们有一个目录,里面有几个文件:

$ ls 
files
$ ls -t ./files
file15.txt  file13.txt  file11.txt  file9.txt  file7.txt  file5.txt  file3.txt  file1.txt
file14.txt  file12.txt  file10.txt  file8.txt  file6.txt  file4.txt  file2.txt

-t选项按修改时间对报告的文件进行排序,因此最先显示最新的文件。我们可以看到,file15.txt是最新的文件,file1.txt是最旧的文件。

3. 脚本

现在,让我们创建脚本。它应该接收文件数量的限制作为参数:

#!/bin/bash
# Print usage if requested.
if [[ $1 == "--help" || $1 == "-h" ]]
then
    echo "Usage: $0 [files limit]"
    exit 0
fi
# The script receives the limit as an argument.
limit=$1
number_of_files=$(ls ./files | wc -l)
if [ $number_of_files -gt $limit ]
then
    # There are more files than the limit
    # So we need to remove the older ones.
    cd files
    ls -t | tail --lines=+$(expr $limit + 1) | xargs -d '\n' rm
fi

在上面的代码中,  wc -l使用换行符*\n作为分隔符来计算./files*中的文件 。

ls -t按修改时间列出文件并将最新的文件放在最前面。

*tail –lines=+$(expr $limit + 1)*输出紧接在限制之后的文件。因此,我们现在拥有需要删除的所有文件。 最后,xargs -d ‘\n’使用换行符作为分隔符,将每个文件作为参数提供给rm ,以便将它们删除。

4. 执行脚本

保存脚本后,我们需要使其可执行才能执行它:

$ ls
count_then_remove.sh  files
$ chmod u+x count_then_remove.sh

chmod u+x使脚本可执行。让我们运行它:

$ ./count_then_remove.sh 5 
$ ls -t ./files
file15.txt  file14.txt  file13.txt  file12.txt  file11.txt

我们可以看到脚本已经删除了旧文件。结果,剩下五个文件。