对 Bash 脚本中的“find”命令感到困惑?

MOD*_*unt 8 bash find shell-script

我有一个 bash 脚本,它是由无法解释其含义的人创建的,用于自动对文件夹进行 TAR 处理并对其进行备份。目前我对最后一行感到困惑:

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete
Run Code Online (Sandbox Code Playgroud)

完整的脚本如下。

#!/bin/bash
#Purpose = Backup of Important Data
#Created on 17-1-2012
#Author = Hafiz Haider
#Version 1.0
#START
TIME=$(date +"%m-%d-%Y-%T")
FILENAME=pokebrawl-$TIME.tar.gz
SRCDIR=/home/servers/brawl/world
DESDIR=/home/_backups/pokebrawl
tar -cpzf $DESDIR/$FILENAME $SRCDIR
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete
#END
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 11

find命令将删除目录中或/home/_backups/pokebrawl目录下超过 7 天(或更准确地说,在上周内未修改)的任何常规文件。

它应该大概

find "$DESDIR" -mtime +6 -type f -delete
Run Code Online (Sandbox Code Playgroud)

或者

find "${DESDIR:?Not set correctly}" -mtime +6 -type f -delete
Run Code Online (Sandbox Code Playgroud)

因为已经有一个非常好的变量保存该目录名称。如果DESDIR由于某种原因为空或未设置,则第二个变体将导致错误。

我假设这是一种仅保留上周备份价值的方法。我建议使用类似borgbackuprestic代替的东西,因为它们可以在不使用更多空间的情况下将备份保留更长时间(如果数据变化不大,即使一年的每小时备份也不会占用太多空间) . 他们对数据进行重复数据删除并borgbackup额外支持压缩(两者都支持远程备份和加密)。

要每 24 小时(午夜)运行脚本,请使用 cron 作业。

首先,发出命令crontab -e。这将为活动用户打开一个带有当前 crontab 的编辑器(这可能是也可能不是空文件)。

然后加

@daily /path/to/the/script.sh
Run Code Online (Sandbox Code Playgroud)

path/to/the/script.sh脚本的路径名在哪里)。

保存并退出编辑器。

该脚本现在将在午夜甚至晚上调用。

如果您想在每天下午 13:30 运行脚本,请将以下内容添加为 crontab 条目:

30 13 * * * /path/to/the/script.sh
Run Code Online (Sandbox Code Playgroud)

有关如何编写 crontab 计划的详细信息,请参阅系统上的 crontab 手册 ( man 5 crontab)。


slm*_*slm 5

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete
Run Code Online (Sandbox Code Playgroud)

这将查找目录/home/_backups/pokebrawl中最近+6几天未修改的所有文件并删除它们。注意:+6相当于 7 天。

查看man find这些开关的工作原理:

$ man find
...
   -mtime n
          File's data was last modified n*24 hours ago.  See the comments 
          for -atime to understand how rounding affects the interpretation 
          of file modification times.
Run Code Online (Sandbox Code Playgroud)

在 Redhat 发行版上,您只需将此脚本放在目录中/etc/crondaily,它就会每天运行。您可以看到那里已经有其他脚本可以用作示例:

$ sudo ls -l /etc/cron.daily/
total 12
-rwx------. 1 root root 219 Aug  1  2017 logrotate
-rwxr-xr-x. 1 root root 618 Mar 17  2014 man-db.cron
-rwx------. 1 root root 208 Nov  4  2016 mlocate
Run Code Online (Sandbox Code Playgroud)