毎日ディレクトリをアーカイブする方法(MEMO)

USER

yyyymmdd-files.tar.gzの形式で、午前0時に特定のディレクトリをアーカイブするには、どのようなコマンドをcronに入れればいいですか?step by stepでおしえてください。

ASSISTANT

以下は、毎日午前0時に特定のディレクトリをyyyymmdd-files.tar.gz形式でアーカイブするためのステップバイステップの手順です。

  1. cronジョブを編集するために、以下のコマンドを実行します。
crontab -e
  1. エディタが起動するので、追加したいジョブのために新しい行を作成します。
0 0 * * * tar -czvf /path/to/archive/$(date '+%Y%m%d')-files.tar.gz /path/to/directory/to/archive

このジョブは、毎日午前0時に実行され、指定したディレクトリをyyyymmdd-files.tar.gz形式でアーカイブします。ファイル名には現在の日付が含まれます。

  1. ジョブを保存して終了します。これで、cronジョブがセットアップされ、毎日自動的にディレクトリがアーカイブされます。

注:この例では、アーカイブファイルを作成するパス(/path/to/archive/)とアーカイブするディレクトリのパス(/path/to/directory/to/archive)を変更する必要があります。

USER

bashではなくshなのですが、shで書いてもらえますか?

ASSISTANT

もちろんです。以下は、shで毎日午前0時に指定したディレクトリをyyyymmdd-files.tar.gz形式でアーカイブするスクリプトです。

  1. スクリプトファイルを作成します。
nano archive_script.sh
  1. スクリプトに以下を追加します。
#!/bin/sh
tar -czvf /path/to/archive/$(date '+%Y%m%d')-files.tar.gz /path/to/directory/to/archive

このスクリプトは、現在の日付を使用して、指定したディレクトリをyyyymmdd-files.tar.gz形式でアーカイブします。

  1. スクリプトを保存して終了します。
  2. スクリプトを実行可能にするために、以下のコマンドを実行します。
chmod +x archive_script.sh
  1. cronジョブを編集するために、以下のコマンドを実行します。
crontab -e
  1. エディタが起動するので、追加したいジョブのために新しい行を作成します。
0 0 * * * /path/to/archive_script.sh

このジョブは、毎日午前0時に実行され、スクリプトファイルを実行して、指定したディレクトリをyyyymmdd-files.tar.gz形式でアーカイブします。

  1. ジョブを保存して終了します。これで、cronジョブがセットアップされ、毎日自動的にディレクトリがアーカイブされます。

注:この例では、アーカイブファイルを作成するパス(/path/to/archive/)とアーカイブするディレクトリのパス(/path/to/directory/to/archive)を変更する必要があります。

USER

bashではないです。shです。その場合 $(date ‘+%Y%m%d’) の部分を書き直す必要があると思いますがいかがですか?

ASSISTANT

申し訳ありません、先程の回答にて不適切な表現がありました。
以下は、shで毎日午前0時に指定したディレクトリをyyyymmdd-files.tar.gz形式でアーカイブするスクリプトです。

  1. スクリプトファイルを作成します。
nano archive_script.sh
  1. スクリプトに以下を追加します。
#!/bin/sh
NOW=$(date +"%Y%m%d")
tar -czvf /path/to/archive/$NOW-files.tar.gz /path/to/directory/to/archive

このスクリプトは、現在の日付を使用して、指定したディレクトリをyyyymmdd-files.tar.gz形式でアーカイブします。

  1. スクリプトを保存して終了します。
  2. スクリプトを実行可能にするために、以下のコマンドを実行します。
chmod +x archive_script.sh
  1. cronジョブを編集するために、以下のコマンドを実行します。
crontab -e
  1. エディタが起動するので、追加したいジョブのために新しい行を作成します。
0 0 * * * /path/to/archive_script.sh

このジョブは、毎日午前0時に実行され、スクリプトファイルを実行して、指定したディレクトリをyyyymmdd-files.tar.gz形式でアーカイブします。

  1. ジョブを保存して終了します。これで、cronジョブがセットアップされ、毎日自動的にディレクトリがアーカイブされます。

注:この例では、アーカイブファイルを作成するパス(/path/to/archive/)とアーカイブするディレクトリのパス(/path/to/directory/to/archive)を変更する必要があります。

USER

私はyyyymmddの部分を$ではなく、バッククォートを使ってかいているのですが、その場合どのようになりますか?

ASSISTANT

バッククォートを使用して、スクリプト内で日付を取得することもできます。以下は、バッククォートを使用したスクリプトの例です。

#!/bin/sh
NOW=`date +"%Y%m%d"`
tar -czvf /path/to/archive/$NOW-files.tar.gz /path/to/directory/to/archive

バッククォートを使用して、date +"%Y%m%d"コマンドの出力を変数NOWに代入しています。これにより、アーカイブファイル名に現在の日付が含まれるようになります。

その他の部分は、先程説明したスクリプトと同じです。cronジョブも同じように設定することができます。

0 0 * * * /path/to/archive_script.sh

注:この例では、アーカイブファイルを作成するパス(/path/to/archive/)とアーカイブするディレクトリのパス(/path/to/directory/to/archive)を変更する必要があります。

USER

ありがとうございます。
このアーカイブファイルを作成した後に、8日前のyyyymmdd-files.tar.gzを削除して、最大7日分のみ保持したく思います。8日前のファイルを削除するコマンドも追加してもらえますか。

ASSISTANT

はい、ファイルの保持期間を制限するために、古いファイルを削除するコマンドを追加できます。以下は、7日間だけアーカイブファイルを保持するように、スクリプトを変更した例です。

#!/bin/sh
NOW=`date +"%Y%m%d"`
ARCHIVE_DIR="/path/to/archive"
ARCHIVE_FILE="$ARCHIVE_DIR/$NOW-files.tar.gz"

# ディレクトリをアーカイブする
tar -czvf $ARCHIVE_FILE /path/to/directory/to/archive

# 7日以上前のファイルを削除する
find $ARCHIVE_DIR -maxdepth 1 -type f -name "*-files.tar.gz" -mtime +7 -exec rm {} \;

このスクリプトでは、7日以上前のyyyymmdd-files.tar.gzファイルを削除するために、findコマンドを使用しています。-maxdepthオプションは、検索する最大深度を制限し、ここではディレクトリ内のファイルのみを検索するように指定されています。-type fオプションは、ファイルを検索するように指定し、-name "*-files.tar.gz"オプションは、ファイル名に”-files.tar.gz”が含まれるファイルのみを検索するように指定されています。-mtime +7オプションは、ファイルの最終更新日が7日以上前のものを検索するように指定されています。

最後に、-exec rm {} \;オプションは、検索されたファイルを削除するためにrmコマンドを実行します。

以上のスクリプトを毎日実行するようにcronジョブを設定すると、7日以上前のファイルを自動的に削除するようになります。

注:この例では、アーカイブファイルを作成するパス(/path/to/archive/)とアーカイブするディレクトリのパス(/path/to/directory/to/archive)を変更する必要があります。

USER

findで利用した各種オプションを、どのような意味があるかおしえてもらえますか。

ASSISTANT

はい、以下にfindコマンドで使用された各種オプションについて説明します。

find $ARCHIVE_DIR -maxdepth 1 -type f -name "*-files.tar.gz" -mtime +7 -exec rm {} \;
  • $ARCHIVE_DIR:検索するディレクトリのパス。この場合はアーカイブファイルを格納しているディレクトリです。
  • -maxdepth 1:検索する最大の深さを指定します。ここでは、検索するディレクトリ内のファイルのみを検索するように制限しています。
  • -type f:検索するオブジェクトの種類を指定します。ここではファイルを指定しています。
  • -name "*-files.tar.gz":ファイル名のパターンを指定します。ここでは、”-files.tar.gz”で終わるファイルを検索しています。
  • -mtime +7:最終更新日が指定した日数以上経過したファイルを検索します。ここでは、7日以上前のファイルを検索しています。
  • -exec rm {} \;:検索されたファイルを削除するためにrmコマンドを実行します。{}は、検索されたファイル名に置き換えられます。

以上のオプションを使用することで、指定されたディレクトリ内で7日以上前の指定されたファイルを自動的に削除することができます。