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

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

我有一个 bash 脚本,由不再能够解释其含义的人创建,用于自动 TARing 文件夹并备份它。目前我对最后一行感到困惑:

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

完整的脚本如下。

#!/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

答案1

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

它应该大概

find "$DESDIR" -mtime +6 -type f -delete

或者

find "${DESDIR:?Not set correctly}" -mtime +6 -type f -delete

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

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

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

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

然后加

@daily /path/to/the/script.sh

(其中path/to/the/script.sh是脚本的路径名)。

保存并退出编辑器。

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

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

30 13 * * * /path/to/the/script.sh

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

答案2

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

这会找到目录中/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.

在 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

相关内容