Linux環境でソースを自動バックアップするスクリプトを作成

# 概要
本記事にはLinux環境で開発しているソースを一時的に自動バックアップするためにスクリプトを作成してみます。
通常の業務ではGITなどを利用する認識ですが、それが提供されてない環境ではこのようなスクリプトがあると便利だなと思って作成してみます。

# 事前準備
今回はCSHを利用していますので、下記のコマンドからパッケージをインストールします。

・cshをインストールします。

~~~bash
sudo apt-get install csh
~~~

# ソース
以下のソースを作成し、src_bk.cshファイル名に保存します。

~~~bash
#!/bin/csh -f

#システムの日付を設定します。
set target_date = `/bin/date +%Y%m%d`

#２か月前の年度（YYYYMM）を設定します。
set ymds = `/bin/date -d '2 months ago' '+%Y%m'`

#パラメータ１を設定します。
#例）時間、AM、PMなどを指定します。
set param = $argv[1]

#tar圧縮
#サブディレクトリをすべて圧縮する場合は「*」を指定します。
#一部のサブディレクトリを指定する場合は、「work/*」を指定します。
set result = `tar cvfp /home/pi/work_${target_date}_${param}.tar work/*`

#tar圧縮ファイルを２か月前のファイルを自動削除します。
set delete = `rm -rf /home/pi/work_${ymds}*.tar`
~~~

# 実行結果
上記のソースを下記のコマンドで実行します。

・コマンド

~~~bash
# 引数の指定がない場合、以下のエラーメッセージが表示されます。
pi@raspberrypi:~ $ csh src_bk.csh 
argv: Subscript out of range.

# 引数に現在の時間を指定してスクリプトファイルを実行します。
pi@raspberrypi:~ $ csh src_bk.csh 0926
rm: No match.
※「rm: No match.」メッセージは削除する対象ファイルがないので、このメッセージが表示されます。
~~~

# crontabにて自動バックアップを実行
以下の内容をcrontabに定義します。

~~~bash
# 昼時間に午前中の作業ソースをバックアップ
30 12 * * 1-5 cd /home/pi/;/bin/csh src_bk.csh am > /dev/null 2>&1
# １日業務終了後に作業ソースをバックアップ
00 22 * * 1-5 cd /home/pi/;/bin/csh src_bk.csh pm > /dev/null 2>&1
~~~

# crontabから実行結果
コンソール上で上記のcrontabのコマンドを手動で実行しました。

~~~bash
# コマンド実行結果
pi@raspberrypi:~ $ cd /home/pi/;/bin/csh src_bk.csh am
rm: No match.

# ファイルを確認
# 「work_20240229_am.tar」ファイルが作成されていることが確認できます。
pi@raspberrypi:~ $ ls -l
total 276
drwxr-xr-x 2 pi pi   4096 May  3  2023 Bookshelf
drwxr-xr-x 3 pi pi   4096 Dec  6 07:29 Desktop
drwxr-xr-x 2 pi pi   4096 May  3  2023 Documents
drwxr-xr-x 2 pi pi   4096 Dec 16 03:05 Downloads
drwxrwxrwx 4 pi pi   4096 Nov  7 12:04 etc
drwxr-xr-x 2 pi pi   4096 May  3  2023 Music
drwxr-xr-x 2 pi pi   4096 May  3  2023 Pictures
drwxr-xr-x 2 pi pi   4096 May  3  2023 Public
-rw-r--r-- 1 pi pi    648 Feb 29 09:25 src_bk.csh
drwxr-xr-x 2 pi pi   4096 May  3  2023 Templates
drwxr-xr-x 2 pi pi   4096 Dec  6 07:27 Videos
drwxr-xr-x 2 pi pi   4096 Feb 29 08:49 work
-rw-r--r-- 1 pi pi 112640 Feb 29 09:26 work_20240229_0926.tar
-rw-r--r-- 1 pi pi 112640 Feb 29 09:44 work_20240229_am.tar
~~~

# 圧縮ファイルを解凍
次のコマンドで圧縮されたファイルを解凍します。

~~~bash
# 一時ディレクトリを作成
pi@raspberrypi:~ $ mkdir source

# 解凍するディレクトリへ移動
pi@raspberrypi:~ $ cd source

# 圧縮ファイルを解凍
pi@raspberrypi:~/source $ tar xvfp ../work_20240229_am.tar 

# 解凍されたファイル一覧
work/index.php
work/news.html
work/newsj.html
work/news.php

# 解凍されたディレクトリを確認
pi@raspberrypi:~/source $ ls -alh
total 12K
drwxr-xr-x  3 pi pi 4.0K Feb 29 09:48 .
drwxr-xr-x 25 pi pi 4.0K Feb 29 09:48 ..
drwxr-xr-x  2 pi pi 4.0K Feb 29 09:48 work

# 解凍されたディレクトリの中のファイル一覧を確認
pi@raspberrypi:~/source $ ls -alh work
total 116K
drwxr-xr-x 2 pi pi 4.0K Feb 29 09:48 .
drwxr-xr-x 3 pi pi 4.0K Feb 29 09:48 ..
-rwxrwxrwx 1 pi pi 2.1K Jan 21 09:55 index.php
-rw-r--r-- 1 pi pi  49K Jan 21 09:55 news.html
-rw-r--r-- 1 pi pi  46K Jan 21 09:51 newsj.html
-rwxr-xr-x 1 pi pi 2.1K Jan 21 01:57 news.php
~~~

# tar圧縮のオプション
今回利用しているオプションは「cvfp」でした。

■圧縮
c:新しいアーカイブを作成する
v:処理したファイルを詳しく出力する
f:アーカイブファイル名を指定する
p:所有者などのファイル属性を保持する（スーパーユーザーのデフォルト）

■解凍
x:アーカイブからファイルを抽出する
v:処理したファイルを詳しく出力する
f:アーカイブファイル名を指定する
p:所有者などのファイル属性を保持する（スーパーユーザーのデフォルト）

■各オプションを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/dc7d5805-251c-5cc4-e4a3-d382274711ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/74aced1a-b939-a304-d445-df7c8b5035db.png)

■参照サイト

https://atmarkit.itmedia.co.jp/ait/articles/1608/15/news015.html

# 注意事項
Linux環境で圧縮したtarファイルをWindows環境で解凍するとソースコードの改行コードがWindowsの「\r\n」になりますので、注意が必要です。
その場合は、圧縮スクリプトの中で「tar→zip」コマンドを利用してZIPファイルを圧縮するとLinux環境の改行コードが「\n」のまま保持されます。

■tar→zip修正
実際にtarファイルとzipファイルをWindows環境にて解凍して改行コードを確認してみてください。

~~~bash
# 変更前：tar
set result = `tar cvfp /home/pi/work_${target_date}_${param}.tar work/*`
# 変更後：zip
set result = `zip -r /home/pi/work_${target_date}_${param}.zip work/*`
~~~

# 終わりに
今日はソースを平日の指定した時間に自動バックアップするコードを書いてみました。
毎回手動でバックアップしていた手作業をcrontabツールと今回のソースで自動バックアップすることができました。
ソースファイルの午前、午後分けてバックアップしていますが、そこは各自自分に合わせて編集すればよいと思います。
今日はここまです。
ありがとうございます。