3日以前のバックアップを削除する方法

このQ&Aのポイント
  • 3日以前のバックアップを削除する方法について教えてください。
  • 現在のバックアップ削除の方法は初心者的なものであり、他に良い方法があれば教えてください。
  • 具体的なバックアップ削除のスクリプトをお教えください。
回答を見る
  • ベストアンサー

3日以前のバックアップを削除する

/etc/crontabで以下のbackup.shを毎晩実行するのですが、 3日以前のものは毎回消していく場合は以下のような、 少し初心者的な書き方しか現在分からないのですが、 他にもし良い書き方があれば、教えていただけますでしょうか? よろしくお願いします。 #!/bin/sh DATE_1=`date -d '1 day ago' +%Y%m%d` DATE_2=`date -d '2 days ago' +%Y%m%d` DATE_3=`date -d '3 days ago' +%Y%m%d` if [ test_$DATE_2.tar.gz ]; then mv -f test_$DATE_2.tar.gz test_$DATE_3.tar.gz fi rm -f test_$DATE_3.tar.gz if [ test_$DATE_1.tar.gz ]; then mv -f test_$DATE_1.tar.gz test_$DATE_2.tar.gz fi if [ test.tar.gz ]; then mv -f test.tar.gz test_$DATE_1.tar.gz fi tar zcvf test.tar.gz /usr/local/test

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

えーとまず、 if [ test_$DATE_2.tar.gz ]; 等は常に真です。おそらくは、その名前のファイルが存在するかどうか調べたいと思うので、その場合は、 if [ -f test_$DATE_2.tar.gz ]; です。 それにしても意味不明のスクリプトです。本当にこれでやりたいことになっていますか?日本語に直して読んでみてください。 普通のやり方は2通りあって、 案1:ファイルに連番をつけて3世代残す (1)ファイル3があれば消す (2)ファイル2があればファイル3にリネーム (3)ファイル1があればファイル2にリネーム (4)ファイルがあればファイル1にリネーム (5)ファイルを作成 test -f test_3.tar.gz && rm test_3.tar.gz test -f test_2.tar.gz && mv test_2.tar.gz test_3.tar.gz test -f test_1.tar.gz && mv test_1.tar.gz test_2.tar.gz test -f test.tar.gz && mv test.tar.gz test_1.tar.gz tar zcvf test.tar.gz /usrl/local/test 案2:タイムスタンプが古いものを消す (1)タイムスタンプが4日以上のものを消す (2)日付入りのファイルを作る find -name 'test_*.tar.gz' -mtime +3 | xargs -r rm tar zcvf test_`date +%Y%m%d`.tar.gz /usr/local/test

関連するQ&A

  • bashスクリプト

    bashスクリプト #!/bin/bash if [ -f *.log ]; then  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi このようなスクリプトでecho ``(バックオート)でコマンドを実行できると思うんですが, tar czf $(date +"%Y_%m_%d").tar.gz *.log←これ自体を表示できないでしょうか? いまは,以下のようにしてコマンドを実行させ,さらに表示させています. これだとあまり賢くないというか,1行でスマートに表示させたいのですが, 可能でしょうか? if [ -f *.log ]; then  echo "tar czf $(date +"%Y_%m_%d").tar.gz *.log"  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi

  • データベースのバックアップだけ取れない場合があって困ってます(バックアップ用シェルの書き方に関して)

    以下のようなシェルをcronで実行し、バックアップを取ろうとしているのですが、データベースのバックアップだけ、うまくいく場合と抜けてしまう場合があります。 下のシェルのどの部分を変えれば、データベースのバックアップも毎回ちゃんと取ってくれるようになるのでしょうか。 ------------------------------ #!/bin/bash NAME="name" DBNAME="dbname" DBUSER="dbuser" DBPASS="dbpass" HTML="/home/test/www/" BACKUPDIR="/bakup/" mkdir -p $BACKUPDIR$NAME mkdir /tmp/backup-$NAME-`date +%Y%m%d` mysqldump --databases $DBNAME > /tmp/backup-$NAME-`date +%Y%m%d`/bk.sql -u $DBUSER --password=$DBPASS --opt ( cd /tmp/backup-$NAME-`date +%Y%m%d` ; tar cf /tmp/backup-$NAME-`date +%Y%m%d`.tar . ) ( cd $HTML; tar rf /tmp/backup-$NAME-`date +%Y%m%d`.tar . ) rm -r /tmp/backup-$NAME-`date +%Y%m%d` gzip /tmp/backup-$NAME-`date +%Y%m%d`.tar mv -f /tmp/backup-$NAME-`date +%Y%m%d`.tar.gz $BACKUPDIR$NAME find $BACKUPDIR$NAME -type f -mtime +7 | xargs rm -f ------------------------------ それでは、宜しくお願いします!

  • Linuxでバックアップのために別のハードにファイルを転送したいです。

    Linuxでバックアップのために別のハードにファイルを転送したいです。 とても困っています。どうか力を貸してください。よろしくお願いします。 下のソースを毎日実行するようにクーロンで設定しています。 下記でコメントアウトしている##ファイル転送##の処理以外は成功しています。 バックアップ用の圧縮ファイル作成と古いファイルの削除が成功しています。しかし、 同じハード内にあるのでハード自体が潰れた場合に備えて別のハードに転送したいです。 Linux初心者で調べながら作成しています。 他に必要な情報があれば教えて下さい。よろしくお願いします。 ----(↓↓↓ソースです↓↓↓)---------------------------------------- #!/bin/sh if [ -x /usr/local/pgsql/bin/pg_dump ]; then today=`date +%y%m%d` filenm="/home/backup/postgres/$1" su postgres -c "/usr/local/pgsql/bin/pg_dump $1 > $filenm$today" tar zcvf $filenm$today.tar.gz $filenm$today chown backup $filenm$today.tar.gz chgrp backup $filenm$today.tar.gz chmod 640 $filenm$today.tar.gz rm -f $filenm$today # remove old backup file oldday=`date --date '1 weeks ago' '+%y%m%d'` rm -f $filenm$oldday.tar.gz ##ファイル転送## # USERNAME='system\\backup' # PASSWORD=●●●●●●●●●●● # HOSTNAME=192.168.●●.●● #ftp -n <<EOL #open ${HOSTNAME} #user ${USERNAME} ${PASSWORD} #binary #cd backup #put $filenm$today.tar.gz #bye #EOL fi exit 0 ----(↑↑↑ソースです↑↑↑)----------------------------------------

  • ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.lo

    ある特定のフォルダの中に、2つの圧縮ファイルが存在すれば、bbb.log.1を削除し、存在しなければその旨をmessagesに記述するというシェルスクリプトを作成しました。 (OSはCentOS5.4で、cronで作成したシェルスクリプトを動作させております) <シェルスクリプトの内容> #!/bin/sh DATE=`date +%Y%m%d --date '1 day ago'` i=/var/log/aaa/bbb.log j=/var/log/aaa/ccc.log cat $i.1 | grep type=ccc > $j.$DATE sed '/type=ccc/d' $i.1 > $i.100 /bin/mv $i.100 $i.$DATE /bin/gzip $i.$DATE /bin/gzip $j.$DATE if [ test -e $i.$DATE.gz ]; then if [ test -e $j.$DATE.gz ]; then rm -f $i.1 else logger -p user.info "not find ccc.log" fi else logger -p user.info "not find bbb.log" fi これを実際に動作させますと、以下のエラーが表示されます。 ./test.sh: line 15: [: -e: binary operator expected どのように記述すれば正しく動作するのでしょうか。 お手数をおかけしますが、よろしくお願い致します。

  • 差分バックアップのコマンド

    今使用しているサーバのバックアップに 毎日フルバックアップで二時間もかかるんで 差分バックアップに変えようかなーとか 思ってるんですが、下のコマンドってあってます? time find /home/data -mtime -1 ! -type d -print | tar cfz /home/backup/test/backupdata-`date +%Y%m%d`.tar.gz ちなみに当日変更・新規作成したものだけバックアップしたいです。 dumpとかがいいんでしょうけど、できればtarでやりたいんです。 教えてくださいお願いします。

  • シェルスクリプト:N日前の日付の取得

    #/bin/sh DAY=$1 TIME=`date --date '"$DAY" day ago' +%Y%m%d` echo $TIME 上を実行しても$DAYが展開されず、 date: invalid date '"$DAY" day ago' と、dateコマンドがエラーを返してきます。 $DAYを展開させるためにはどうクォートすればいいのでしょうか?

  • Linuxを勉強中のものです。

    Linuxを勉強中のものです。 IF文の複合文で困っております。 (OSはCentOS5.4です) #!/bin/sh DATE=`date +%Y%m%d --date '1 day ago'` address1=test@test.co.jp address2=admin@test.co.jp subject1="ccc.logは削除されませんでした" subject2="ccc.logは削除されました" subject1=`echo $subject | nkf -j` subject2=`echo $subject | nkf -j` honbun1="bbb.logが見付からなかったため、ccc.logは削除されませんでした。" honbun2="aaa.logが見付からなかったため、ccc.logは削除されませんでした。" honbun3="ccc.logは削除されました。" if [ -e aaa.gz ]; then if [ -e bbb.gz ]; then { rm -f ccc.log; mail -s "$subject2" $address1 -- -f $address2 << honbun; `echo $honbun3 | nkf -j`; honbun; } else { mail -s "$subject1" $address1 -- -f $address2 << honbun; `echo $honbun1 | nkf -j`; honbun; } fi else { mail -s "$subject1" $address1 -- -f $address2 << honbun; `echo $honbun2 | nkf -j`; honbun; } fi 上のシェルスクリプトを実行すると、エラー表示され動作しません。 エラー >> line 32: syntax error: unexpected end of file どんな些細な情報でも結構ですので、ご教授下さい。 宜しくお願い致します。

  • tar zcf  で Argument list too long のエラーが出る

    aaa下の中身を圧縮して test.tar.gz を作り、これを bbb下に移動させるのを 以下のようにshで行っています。 #!/bin/bash cd /aaa tar zcf test.tar.gz * mv test.tar.gz /bbb これを、なにか圧縮コマンドのオプションを使って 圧縮元と圧縮ファイル作成先を指定して、1行で済ますことは出来ますか? tar zcf /bbb/test.tar.gz /aaa/*   を試してみましたが、 -bash: /bin/tar: Argument list too long と出てしまいます。ご教授宜しく御願いいたします。

  • シェルスクリプトのテスト

    年が変わるとシェルの処理も替わります。 例えば: year=`date +%Y` if [ $year=2006 ];then echo "year 2006" fi if [ $year=2007 ];then echo "year 2007" fi テストをしたいですが、 2007年のテストは出来ますでしょうか? 教えてください!お願いします。

  • linux シェルの変数、引数の指定について教えて

    シェルの勉強を始めまして、 ファイルを複合化、解凍するだけのシェルを作ろうと思っています。 fukugo.sh $1 でシェルを実行 /home/allday/log/upload/201701261507(←ログの作られる時間で変わります)aaaaa.tar.gz.e というファイルを$1引数に指定 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー !/bin/sh # # init CWD=$(cd $(dirname $0) && pwd) #cd ${CWD} # if [ -z $1 ] then echo "引数を指定してください" exit fi echo "Start" echo "指定されたtarファイルを複合化します" fukugo-decrypt $1 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー fukugo-decryptは私の会社で使われているtarを複合化するコマンドです(環境変数?) 複合化すると /home/allday/log/upload/201701261507aaaaa.tar.gz というファイルになります。 このできたファイルをシェルに入れる次のコマンドの引数にしたいです。 が最後の.eが無くなるため$1では指定できないと思います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー echo "複合化されたファイルを/tmpフォルダに入れておきます" mv /home/allday/log/upload/201701261507aaaaa.tar.gz /tmp/ echo "ファイルを展開します" tar zxvf /tmp/201701261507aaaaa.tar.gz echo "End" ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 複合化された後の/home/allday/log/upload/201701261507aaaaa.tar.gzや 移動後の/tmp/201701261507aaaaa.tar.gzは変数で設定するとよいと聞いたのですが、 どのように設定すればよいかわかりません。 お分かりになる方、お願いします。 教えてください。