我想创建一个 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 命令。
我将您的问题解释为“我如何计算文件,如果超过 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命令会将删除限制为仅常规文件(即不是目录)。
只要您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。
| 归档时间: |
|
| 查看次数: |
1539 次 |
| 最近记录: |