初めましてshoです。
今回はとあることがキッカケで以下の処理を目的とするシェルスクリプトを作成いたしました!
・任意のファイルを日付つきでバックアップする(cpコマンド)
・同じ日に同じファイルのバックアップがあった際は時間、秒数を追加してバックアップする
・実行時は実行内容の表示
簡単なコードなので実用性は低いとは思います。もしアドバイス等何かあればコメントいただけると嬉しいです。
(※学習記録やメモ書き目的で始めました。ほぼ初学者レベルなので理解が浅いところや誤りがあるかと思いますがよろしくお願いします。またアドバイス等コメントいただけるとすっごく嬉しいです。早く先輩方のお力になれるよう精進します。)
#とりあえずシェルスクリプトの中身
#!/bin/sh
file_name="$@"
backup_file_name=${file_name}.$(date +%Y%m%d)
if [ ! -e ${backup_file_name} ]
then
cp -pv ${file_name} ${file_name}.$(date +%Y%m%d)
else
cp -pv ${file_name} ${file_name}.$(date +%Y%m%d_%H%M%S)
fi
#実行結果
#ls
file1 file2
#backup-shell file1
`file1' -> `file1.20210307'
#ls
file1 file1.20210307 file2
#backup-shell file1
`file1' -> `file1.20210307_165426'
#ls
file1 file1.20210307 file1.20210307_165426 file2
##解説!
照らし合わせながら処理の流れ。
file_name="$@"
→シェルスクリプト実行時に受け取った引数(今回の場合バックアップしたいファイルのこと)を変数file_nameに格納
backup_file_name=${file_name}.$(date '+%Y%m%d')
→変数backup_file_nameにスクリプト実行時に受けとったファイル名を日付つきで格納
if [ ! -e ${backup_file_name} ]
→変数backup_file_nameのファイルが存在していなければ次の処理をする
then
cp -pv ${file_name} ${file_name}.$(date +%Y%m%d)
→シェルスクリプト実行時に受け取ったファイルに日付をつけてコピーする
else
cp -pv ${file_name} ${file_name}.$(date +%Y%m%d_%H%M%S)
→もし変数backup_file_nameのファイルが存在していたら時間と秒数を追加してコピーする
fi
##もうちょっとだけ詳しく
file_name="$@"
”$@” はシェルスクリプト起動時に付けられた引数の内容をそのまま受け取りたい時に使うもの。
この書き方で下記の
#backup-shell file1
(↑シェルスクリプト名)(↑コピーしたいファイル名)
のようにスクリプト実行時に「スクリプト名 コピー元ファイル名」と入力すればコピー元ファイルをそのまま引き継ぎスクリプトファイル内の変数 $filename に格納してくれる。
if [ ! -e ${backup_file_name} ]
-e は対象が存在しているか確認するもので、今回は ! をつけているので
「対象が存在していない場合」という条件にして最初の処理をしています。
(※「!」をつけると否定文になる)
でも -e は「ファイルタイプにかかわらず、存在すればコマンド実行する場合」に用いられるらしいのでもっと厳密に指定して実行したい場合は違うの使った方がいいのかな。。
・・・てかですね、理解した的に言っていますがこの「-e」を発見するのにめっさ苦労しました。
ひどい。もっとググり力つけたい。
ざっくり書きましたが以上です!
最後まで読んでくださった方いましたらありがとうございます!
####参考にしたサイト↓