在特定条件下删除文件(文件数量、文件期限)

在特定条件下删除文件(文件数量、文件期限)

我想创建一个 shell 脚本来计算文件数量(1 小时前的文件),如果文件超过 1000,则删除所有文件。

对于读取和删除,我在 putty 中使用这些命令

对于计数:

ls /tmp/ | grep 'ci_session*' | wc -l

对于删除文件:

cd /tmp/
find . -name "ci_session*" -exec rm {} \;

#Update:对于删除,我只想删除 1 小时前的文件。

这里我想添加条件,如果总文件大于1000,然后调用删除命令。

答案1

我将你的问题解释为“我如何统计文件,如果超过1000个,删除超过一小时的文件?”。

计算匹配的名称/tmp/ci_session*并在超过 1000 个时执行某些操作:

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    # something
fi

这将位置参数设置为与模式匹配的名称。然后,特殊变量$#包含位置参数的数量。

/tmp/ci_session*如果文件的最后修改时间是在一个多小时前,则删除匹配的文件:

find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete

综合起来:

#!/bin/sh

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete
fi

这里唯一要注意的是计数将是任何与模式匹配的名称(即使是目录名称,如果有的话),而该find命令将删除限制为仅常规文件(即不是目录)。

答案2

只要您find-mmin选择,您就可以这样做:

使用 shell 脚本:

#!/bin/sh

files_dir=/tmp
file_count=$(find "$files_dir" -name 'ci_session*' -mmin 60 -exec echo x \; | wc -l)

if [ "$file_count" -gt 1000 ]; then
    find "$files_dir" -name 'ci_session*' -mmin 60 -exec rm {} \;
fi

file_count将设置为在指定目录中找到的与模式匹配的文件数。

如果file_count大于 1000,我们将再次运行 find 并删除这些文件。


使用 bash 我们可以消除第二次使用数组查找的调用:

#!/bin/bash

files_dir=/tmp
mapfile -t files < <(find "$files_dir" -name 'ci_session*' -mmin 60)

if ((${#files[@]}>1000)); then
    rm "${files[@]}"
fi

注意:根据您期望的文件数量,bash 解决方案可能会遇到您的命令行参数限制

相关内容