![在特定条件下删除文件(文件数量、文件期限)](https://linux22.com/image/150527/%E5%9C%A8%E7%89%B9%E5%AE%9A%E6%9D%A1%E4%BB%B6%E4%B8%8B%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%EF%BC%88%E6%96%87%E4%BB%B6%E6%95%B0%E9%87%8F%E3%80%81%E6%96%87%E4%BB%B6%E6%9C%9F%E9%99%90%EF%BC%89.png)
我想创建一个 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 解决方案可能会遇到您的命令行参数限制。