web-dev-qa-db-ja.com

Bashスクリプトのこの「find」コマンドに混乱しましたか?

私は、意味を説明できなくなった誰かが作成したbashスクリプトを使用しています。これは、フォルダーの自動TAR処理とバックアップに使用されます。現時点では、最後の行と混同しています。

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
8

findコマンドは、7日以上経過した/home/_backups/pokebrawlディレクトリ内またはそれ以下の通常のファイルを削除します(より正確には、先週に変更されていない)。

おそらく読むべきです

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

または

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

そのディレクトリ名をすでに保持している完全に良い変数があるので。 2番目のバリエーションでは、何らかの理由でDESDIRが空または未設定の場合、エラーが発生します。

これは先週分のバックアップのみを保持する方法だと思います。代わりにborgbackupresticのようなものを使用することをお勧めします。これらは、多くのスペースを使用せずにバックアップをより長く保持できるためです(1年の1時間ごとのバックアップでもそれほど時間はかかりません)データがあまり変化していなかった場合は、まったくスペースがありません)。データの重複排除を実行し、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スケジュール(man 5 crontab)を作成する方法の詳細については、システムのcrontabマニュアルを参照してください。

11
Kusalananda
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
5
slm