linux使用find和crontab命令定期清理过期文件
<p><span><strong>crontab 命令</strong></span></p>
<p>
crontab 命令是 Linux 中用来设定重复执行命令或脚本的工具。它能够在指定的时间段内,按照需求以某一时间间隔执行命令或脚本。</p>
<p>
<strong>crontab 的基本用法</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_206425">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash functions">crontab</code> <code class="bash plain">[-u <user>] [-e|-l|-r]</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash functions">crontab</code> <code class="bash plain"><filename></code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<code>crontab <filename></code> 可以读入一个以 crontab 语法书写的文件,并依照文件内的指示执行定时任务。与此同时,<code>crontab -l</code> 能够在标准输出上列出当前用户所有的定时任务情况。因此,我们可以用 <code>crontab -l > <filename></code> 来保存当前 crontab 的状况,在有需要的时候(比如误删除)用 <code>crontab <filename></code> 读入恢复。</p>
<p>
<code>crontab -e </code>则会启动系统默认的编辑器。这个编辑器由系统环境变量 EDITOR 指定;例如<code> export EDITOR=vi</code>,则 <code>crontab -e </code>会启动 vi 来编辑当前用户的 crontab 定时任务文件。<code>crontab -r</code> 则会删除用户的所有 crontab 定时任务。</p>
<p>
用来指定用户的 <code>-u <user></code> 选项则会改变<code> -e/-l/-r</code> 等选项的行为。如果不通过 <code>-u</code> 指定用户,则默认的操作都是针对当前用户的;反之,则针对指定的用户。例如 <code>crontab -u Liam -r</code> 则会删除用户 Liam 的 crontab 定时任务——当然,你需要有足够的权限这么做。</p>
<p>
<strong>crontab 文件的格式</strong></p>
<p>
不管是用 <code>crontab <filename</code>> 从文件读入定时任务,还是用 <code>crontab -e</code> 编辑定时任务,我们都会接触到 crontab 格式的命令。</p>
<p>
<strong>crontab 的命令格式如下:</strong></p>
<p>
<img title="linux使用find和crontab命令定期清理过期文件" alt="linux使用find和crontab命令定期清理过期文件" src="https://zhuji.jb51.net/uploads/img/202305/0cf08d9df4871ee0c79d8055c871e2b1.jpg"></p>
<p>
从上图我们可以看出:</p>
<ol>
<li>
一条 crontab 命令分成六列,写在一行内;</li>
<li>
前 5 列用于定时,指明什么时候开始执行;</li>
<li>
第 6 列用于指定需要定时执行的命令或脚本;</li>
</ol>
<p>
此外,和 Shell 脚本一样,在 crontab 文件中,我们也可以用 # 来表示注释。</p>
<p>
<span><strong>花式定时</strong></span></p>
<p>
在 crontab 命令中用于定时的前 5 列中,支持以下符号,用于「花式定时」:</p>
<ol>
<li>
星花(*):代表所有可能的值;</li>
<li>
逗号(,):用逗号隔开同一字段的不同范围;</li>
<li>
连字符(-):用连字符连接两个整数,表示整数范围;</li>
<li>
斜线(/):实际上是除法斜线,用来指定时间间隔频率。</li>
<li>
</li>
</ol>
<p>
<span><strong>一些例子</strong></span></p>
<p>
有了这些知识,我们就可以看一些实例了。</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_113389">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash comments"># 每分钟执行一次</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash plain">* * * * * </code><code class="bash functions">command</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash comments"># 每 5 分钟执行一次</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash plain">*</code><code class="bash plain">/5</code> <code class="bash plain">* * * * </code><code class="bash functions">command</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash comments"># 每个小时的 15 分和 45 分执行一次</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash plain">15,45 * * * * </code><code class="bash functions">command</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash comments"># 晚上 20:00 -- 20:15 每分钟执行一次</code>
</div>
<div class="line number8 index7 alt1">
<code class="bash plain">0-15 20 * * * </code><code class="bash functions">command</code>
</div>
<div class="line number9 index8 alt2">
<code class="bash comments"># 每周一上午 10 点执行一次</code>
</div>
<div class="line number10 index9 alt1">
<code class="bash plain">0 10 * * 1 </code><code class="bash functions">command</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<span><strong>find —— 找些乐子</strong></span></p>
<p>
man find 给出的 find 命令的一般形式是:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_668147">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash functions">find</code> <code class="bash plain">[-H] [-L] [-P] [-D debugopts] [-Olevel] path ... </code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
其中 <code>[-H] [-L] [-P] [-D debugopts] [-Olevel] </code>很少会用到。因此,find 命令的一般形式可以简化为 f<code>ind path ... ;</code>亦即,在一些路径(默认递归地包含子路径)中找到合适的文件,然后根据 expression 执行相应动作。</p>
<p>
<code>path ...: find</code> 命令查找的路径</p>
<p>
expression: 具体形式是 <code>-parameters [-exec -ok]</code></p>
<p>
<code>-parameters</code> 有很多,待下一节具体介绍常用的参数</p>
<p>
<code> -exec command {}</code> \; 执行一条 Shell 命令</p>
<p>
<code> -ok command {} \</code>; 同 -exec 的作用,不过在执行每条命令前,都会提示用户确认</p>
<p>
<strong>常用的参数</strong></p>
<p>
<code>-name</code> : 按照文件名查找文件,接受通配符</p>
<p>
find . -name "*.cpp": 在当前目录 (.) 及子目录下递归地查找所有后缀为 .cpp 的文件,并打印在标准输出中</p>
<p>
<code>-perm</code> : 按照文件权限查找文件</p>
<p>
find . -perm 755: 在当前目录 (.) 及子目录下递归地查找所有权限为 755 的文件(目录),并打印在标准输出中</p>
<p>
find . -perm 644 -name "*.cpp": 在当前目录及子目录下 (.) 递归地查找所有权限为 644 的 .cpp 文件,并打印在标准输出中</p>
<p>
<code>-group</code> : 按照文件的所属组查找</p>
<p>
<code>-user</code> : 按照文件的所有者查找</p>
<p>
find . -user search: 在当前目录 (.) 及子目录下递归地查找所有 search 账号所属的文件,并打印在标准输出中</p>
<p>
<code>-atime, -mtime, -amin, -mmin</code> : a 开头的表示「按照上次访问时间查找」,m 开头的表示「按照上次修改时间查找」;-n 表示 n 时间内,+n 表示 n 时间以前</p>
<p>
find . -atime +7: 在当前目录 (.) 及子目录下递归地查找所有上次访问在 7 天以前的文件,并打印在标准输出中</p>
<p>
find . -mmin -10: 在当前目录 (.) 及子目录下递归地查找所有上次修改在 10 分钟以内的文件,并打印在标准输出中</p>
<p>
<code>-newer file1 ! file2</code> : 查找比 file1 新但是比 file2 旧的文件</p>
<p>
<code>-type </code> : 按照文件类型查找</p>
<p>
b: 块设备文件</p>
<p>
d: 目录</p>
<p>
c: 字符设备文件</p>
<p>
p: 管道文件</p>
<p>
l: 符号链接文件</p>
<p>
f: 普通文件</p>
<p>
<code>-follow </code>: 如果 find 命令遇到符号链接文件,就跟踪至链接所指向的文件</p>
<p>
<code>-delete</code> : 删除查找到的文件或目录</p>
<p>
<span><strong>定期清理</strong></span></p>
<p>
至此,定期清理无用的文件就变得很简单了。我们只需要在 crontab 里结合 find 命令的 <code>-delete </code>选项即可。</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_816985">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">0 8 * * * </code><code class="bash functions">find</code> <code class="bash plain">/home/s/coredump</code> <code class="bash plain">-user search -</code><code class="bash functions">type</code> <code class="bash plain">f -mtime +7 -delete</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
这里,我们在每天早上 8 点整执行 find 命令;该命令会在 /home/s/coredump 目录下寻找 search 用户创建的普通 7 天前的文件,然后删除掉。</p>
<p>
<span><strong>总结</strong></span></p>
<p>
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。</p>
頁:
[1]