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

Yog*_*oya 5 linux bash find

我想创建一个 shell 脚本来计算文件(1 小时旧文件),如果文件超过 1000,则全部删除。

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

计数:

ls /tmp/ | grep 'ci_session*' | wc -l
Run Code Online (Sandbox Code Playgroud)

对于删除文件:

cd /tmp/
find . -name "ci_session*" -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

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

如果总文件数大于 1000,我想添加条件,然后调用 delete 命令。

Kus*_*nda 7

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

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

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    # something
fi
Run Code Online (Sandbox Code Playgroud)

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

/tmp/ci_session*如果上次修改时间超过一个小时前,则删除匹配的文件:

find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete
Run Code Online (Sandbox Code Playgroud)

综合起来:

#!/bin/sh

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

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


jes*_*e_b 5

只要您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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

注意:取决于您希望有多少文件,bash 解决方案可能会遇到您的命令行参数limit。