特定ディレクトリに日付ディレクトリを作成してバックアップするスクリプトの使い方

このQ&Aのポイント
  • Serversman@VPSで日次バックアップを作成するためのスクリプトの使い方を教えてください。
  • スクリプトを実行すると、日付を名前とするディレクトリが作成され、その中にバックアップが保存されます。
  • スクリプトの先頭に「cd /mnt/smdisk」と追加することで、指定したディレクトリ内に日付ディレクトリを作成することができます。
回答を見る
  • ベストアンサー

dirの場所を指定したい

Serversman@VPSで日次バックアップを作成するためのスクリプトを書いています。 特定のディレクトリの中に、日付を名前とするディレクトリを作って、 その中にバックアップを取りたいのですが、dirの使い方がよく分かりません。 http://www.appleple.com/blog/unix/backup-with-cron.html リンク先の、 dir=$(date +"%Y-%m-%d-%H%M") mkdir $dir cd $dir mysqldump --default-character-set=utf8 -u {ユーザ名} -p{パスワード} ablogcms > ablogcms.sql tar zcfv httpdocs.tgz ../../httpdocs cd ../ find . -name "20*" | sort -r | while read deldir; do let num="${num=0}+1"; if test $num -ge 10; then rm -rf $deldir;fi; done; このスクリプトの場合、日付ディレクトリがルートに作られてしまいますよね。 そうでなく /mnt/smdisk ディレクトリの中に日付ディレクトリを作りたい場合、 スクリプトの最初の部分に一行加えて、 cd /mnt/smdisk ←付け足した行 dir=$(date +"%Y-%m-%d-%H%M") mkdir $dir cd $dir (以下同じ) のようにすれば、目的が達成できますでしょうか? 見よう見まねで付け焼き刃的な勉強をして書いてきたのですが、 どうにも分かりませんでしたので教えて頂ければ助かります。 よろしくお願いいたします。

  • zhy_a
  • お礼率36% (21/57)

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

まず, このスクリプトでは mkdir $dir としていますが, $dir は絶対パスにはならないので, ディレクトリは「この mkdir を実行する時点でのカレントディレクトリ」に作られます. 「この mkdir を実行する時点でのカレントディレクトリ」がどこかは知りませんが, そのあとの tar で ../../httpdocs としているのでおそらくルートディレクトリとは違うのではないでしょうか. そして, cd /mnt/smdisk を追加すると「tar 以外」は大丈夫な感じがします. 逆に tar は適切なディレクトリをとれないのでまずそうな気がする. そもそもこのスクリプト自体無駄に cd してるように思えます. cd せず dir=$(date +"%Y-%m-%d-%H%M") mkdir $dir mysqldump --default-character-set=utf8 -u {ユーザ名} -p{パスワード} ablogcms > $dir/ablogcms.sql tar zcfv $dir/httpdocs.tgz ../httpdocs find . -name "20*" | sort -r | while read deldir; do let num="${num=0}+1"; if test $num -ge 10; then rm -rf $deldir;fi; done; くらいにはすべきだし, 最後の find のパイプラインも怪しいのでもうちょっとすっきりさせたいところ.

zhy_a
質問者

お礼

こんなに早くアドバイスをありがとうございます! >「tar 以外」は大丈夫な感じがします. そうですね、tarの行を見落としていました。 うっかり、このままコピペする勢いだったので助かりました。 教えて頂いたばかりか、エレガントに書き換えて頂くなど何とお礼を申し上げていいか! 最後のfindも考えてみます。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

本来の目的について何も書いてなかった.... とりあえず backuproot=/mnt/smdisk として dir=$(date +"%Y-%m-%d-%H%M") を dir=$backuproot/$(date +"%Y-%m-%d-%H%M") に変え, 最後の find でカレントディレクトリを表す . を $backuproot に置き換えればできるんじゃないかな. dir という変数名はなんか気にいらないので変えた方がいいかもしれんけど. あと, 最後の find のところは while を使わない方がいいんじゃないかなぁ. 多分 find $backuproot -name "20*" | sort -r | sed -e '1,10d' | xargs rm -rf でいけそうな気がする (けど動作確認は自己責任でお願いしますね). ついでにいうとこの find で本当にいいのかどうか微妙だし (もうちょっとオプションを付けたりして限定しておくべきかもしれない), あるいはそもそも find じゃなくて ls に適当なオプションを付ければそれでいいだけなのかもしれない.

関連するQ&A

  • Excelマクロのdirについて質問です

    マクロ Dirでのセルの参照方法で質問です    lens_type = Cells(4, 4) lens_num = Cells(6, 4) lens_date = Cells(7, 4) '* '* 指定レンズタイプの全計測データフォルダ取得 '* folders(0) = Dir("\\128.34.8.110\LDNfsRoot\LensData\" & lens_type & "\" & lens_num & "\WARP\ &lens_date*.", vbDirectory) このようなマクロの書き方をした時 WARPというフォルダー内に20150323184627_IKKのような 日付と時間とアンダーバーとローマ字ので名前が付いたフォルダがあります。 lens_date = Cells(7, 4)でCells(7, 4)に201503まで入力されていれば 201503までの名前に当てはまるものがでてくるはずなのですが 正しく検索されません。 folders(0) = Dir("\\128.34.8.110\LDNfsRoot\LensData\" & lens_type & "\" & lens_num & "\WARP\ &lens_date*.", vbDirectory) これのどこが悪いかわかるかたはいらっしゃいますでしょうか?

  • bashのtimeout コマンド引数の指定

    初心者です。我慢して聞いてほしいです。 timeoutコマンドを使用して、rubyのプログラムに時間制限をかけようと思っています。 対象のrubyスクリプトは事情により、スクリプトのあるディレクトリから呼び出したいのですが、 コマンドの書き方がわかりません。 timeout 100 cd ~/parent_dir/; ruby test_script.rb timeout 100 cd ~/parent_dir/ && ruby test_script.rb timeout 100 `cd ~/parent_dir/ && ruby test_script.rb` どれもうまくいきませんでした。 どうやって書けばよいのでしょうか?

  • コマンド DIRの動作について

    バッチファイルのDIRコマンドでよく分からない事が あるので、ご存知の方、ご教授願います。 あるフォルダ(仮にC:\test\とします。)の中に1行だけ記述された CSVファイルが大量にあります。 これをCOPYコマンドで1ファイルにまとめたいと思います。 しかし、そのフォルダの中にはサブディレクトリがあり、その中にも COPYコマンドの対象としたいCSVファイルがあります。 COPYコマンドはサブディレクトリまで処理対象としてくれない ようですし、サブディレクトリの数は不特定なので、どうしょうかと 困っていたら、あるWebページを見つけました。 ttp://www.fpcu.jp/dosvcmd/bbs/log/copyxcopy/4-1567.html やりたい事はまさにドンピシャで、そのページのコマンドを 自分流に書き換えつつ、完成したのが、以下のコードです。 MKDIR "C:\test2\" XCOPY "C:\test\*.csv" "C:\test2\" /E /Y for /f %%a in ('dir "C:\test\" /b') do XCOPY "C:\test\\%%a\*.csv" "C:\test2\" /E /Y COPY "C:\test2\*.csv" "C:\test2\log.csv" ※変な所で改行が入って見難くなっていたらゴメンナサイ。 上記、コードで試してみた所、WindowsXPでは問題なく動作しました。 しかし、Windows2000で試してみた所、うまく動きませんでした。 PAUSEコマンドを入れて、どんなコマンドが吐かれているのか見たら サブディレクトリを動的に変えようとしてい%%aの中に「ドライブ」 とか「ボリューム」とか入ってくるのです。最初は意味不明でしたが DIRのbオプションを付けない時に、そういう文字がコマンドプロンプト の画面に表示され、それを取得しているんじゃないかという事に 気づきました。ちなみにWindows2000でもDIR C:\test /bとやると フォルダ名、ファイル名しかコマンドプロンプトの画面には表示されません。 気づいたはいいんですが、解決方法が分かりません。 どなたか、コマンドに詳しい方、ご教授ください。 よろしくお願いします。

  • ms-dosコマンドで日付+時刻の名前でmkdir

    windows-xpに標準で入っているものだけで、 ms-dosコマンドで日付+時刻の名前でディレクトリを作成する事は可能でしょうか? 1ランでなくてバッチファイルでも構いません。 日付、時刻のフォーマットは問いませんが、「/」や「:」はOS的にダメです。 秒単位(または100分の1秒単位)は欲しいです。 「20090715120000」とかです。 mkdir 日時の取得 あるいは SET DIR_DT=日時の取得 mkdir %DIR_DT% の日時の取得の箇所が知りたいです。

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

    以下のようなシェルを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 ------------------------------ それでは、宜しくお願いします!

  • javascriptでの日付更新の時間について

    初歩的なことですいませんが・・・ Javascriptについてご教授ください。 以下のような日付を表示するJavascriptがあります。 <SCRIPT LANGUAGE="JavaScript"> <!-- date = new Date(); y = date.getFullYear(); m = date.getMonth() + 1; d = date.getDate(); if (m < 10) { m = "0" + m; } if (d < 10) { d = "0" + d; } document.write(y + "/" + m + "/" + d); // --> </SCRIPT> これの場合、何時に見ようが今現在の日付が表示されますよね・・・ 例えばこれを午前10時になったら今日の日付に表示を変える・・・みたいなことってできますか?? (つまり午前0:00から9:59までは前日の日付を表示させるということなのですが・・・) 分かりにくかったらすいません。 どうかよろしくお願いします><

  • solarisで2週間前のファイルを指定する方法

    現在solarisのシステムを運用しており、ログのバックアップをしています。 クーロンによる時間指定で、別フォルダに圧縮してバックアップという 形なのですが、現在ではたまる一方なので2週間前のものを削除したいと考えています。 ファイルは log_`date "+%Y%m%d"`.tar という風に本日の日付で命名しているので、 本日から二週間前のものを削除、というスクリプトにしたいのですが。。。 if [*** -* ・・・] のような条件設定で、 たとえばファイル名が今日の日付から2週間前の日付が入っているかどうかを判定させるには どうしたらいいでしょうか? またはタイムスタンプを参照して、それが2週間前以前のもの、という指定をする方法があるのでしょうか? よろしくお願いします。

  • 【vba】もしフォルダがなければ作成したい

    Sub test() If Dir("C:\バックアップ\" & Date$) <> "" Then 'ファイルがないなら作成 MkDir "C:\バックアップ\" & Date$ End If End Sub このコードを実行しても ファイルがあってもなくても作成されないのですが 何がおかしいのでしょうか?

  • FTPコマンドで、カレントディレクトリを日付の一番新しいものに移動する方法

    linuxのFTPコマンドについて質問です。 FTPで他のlinuxサーバに入ったあと、  「特定の文字列で始まり、且つその中でも日付が一番新しいディレクトリ」に CDコマンドで移動したいのですが、コマンドでそれを実現することは出来ますでしょうか? lsで表示されたディレクトリの中から目視で新しいディレクトリを探すという ことではなく、シェルの一部に組み込みたいので、 コマンドで対応したいです。 ディレクトリ名は、「○○○1」「○○○2」・・・「○○○5」という 風に「○○○」は同じで数字部分が増えていく形式です。 且つ、一番新しい数字のものが一番新しいタイムスタンプとなっています。 (関係ないディレクトリ「■■■1」~「■■■5」というのも混在しています) なので、dirコマンドで「dir ○○○*」として絞ったあと 日付が最新 or 数字の大きいものというものを抽出した結果を、 CDコマンドに渡せればと思っています。 (方法は問いません) 良い方法があれば、教えていただきたいです。 よろしくお願いします。

  • LinuxでCD-RWをマウントする方法は?

    VineLinuxを使っています。/mntの配下にはfloppy,cdromのディレクトリはあり、それらをmountすることはできますが、当然CD-RWはできません。データのバックアップの目的でmountしたいのですが、どのようにしたら、CD-RWをマウントすることができるのでしょうか。よろしくご指導お願い致します。