最新10日間のデータだけを残して他のディレクトリを削除する方法

このQ&Aのポイント
  • バックアップしているテキストデータの中から最新10日間のデータを保持する方法を教えてください。
  • 現在、crontabで毎晩バックアップをとっていますが、データ量が増えてきたため、最新10日間のデータだけを残して他のディレクトリは削除したいです。
  • ls -trコマンドを使用して日別のディレクトリをソートし、forループを使用して10日以上前のディレクトリを削除する方法を教えてください。
回答を見る
  • ベストアンサー

バックアップしているのですが、常に最新10日間だけのデータを保持したい。

シェルスクリプター初心者です。 現在、crontabで毎晩テキストデータのバックアップをとっています。 backup.shと同ディレクトリにbkディレクトリがあり、bkのなかには日別のディレクトリがあり、その中にテキストがはいっています backup.sh /bk |-20061001-data.txt |-20061002-data.txt L20061003-data.txt ここで、「最新10日間のデータだけを残して他のディレクトリは削除」させたいのですが、やり方がわかりません。 ls -tr コマンドで日別のディレクトリソートはできました。 あとは、for文でループそのデータをループして、10回以上は削除、とできればいいのかな、と思うのですが、いまいちうまくいきません。 どうかお暇なスクリプターのかた、ご教授をお願いいたします。 sun=0 for i in `ls -tr $current/bk/*`; do sum=`expr $sum + 1` if ($sum>10)then  #delete!  該当する$iを削除する処理 fi done ※なお、回答多数になってしまった場合は詳細な方から、どちらも詳細に書かれている場合は早い方から順番にポイントをつけさせていただきますのでご了承ください。

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

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

あ, 自分ってあほだ.... なんで find 使わないんだ.... find $current/bk -maxdepth 1 -mindepth 1 -ctime +10 -print で「$current/bk の直下にあって, 最後に更新されてから 10日以上たっている」ファイルやディレクトリが表示されるはず. これをパイプで xargs rm -rf に送ればいいんじゃないかな? これもやっぱりテストした方がよいかと. なお, ls $current/bk と ls $current/bk |tail +11 で同じ結果になるのは変だと思います. 後者は tail +11 で「11行目以降」を表示するはずなので. そのあとの xargs rm -rf は, 「tail を通って表示されるもの」に適用されるので, カレントディレクトリにある同名のファイル/ディレクトリを消しちゃいます.

haniwannko
質問者

お礼

再度の回答ありがとうございます。 せっかくですが、私が異動になってしまって…教わったスクリプトを使う機会がなくなってしまいました・・orz でも、大変勉強になりました。ありがとうございました。

haniwannko
質問者

補足

ポイントを付けるのが遅くなってしまい申し訳ありませんでした。

その他の回答 (1)

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

手元ではテストしていませんので, 一度安全なところでテストしてみてください: ls -tr "$current/bk" |tail +11 | xargs rm -rf

haniwannko
質問者

お礼

回答ありがとうございます。 さっそく実行してみましたが、 ls -tr "$current/bk" までは問題なしなのですが、 ls -tr "$current/bk" |tail +11 になると単なるbk以下全ディレクトリの羅列になり、 ls -tr "$current/bk" |tail +11 | xargs rm -rf を実行してもひとつもディレクトリは消えていませんでした。 今回はダメでしたが、tailにパイプする、というのは思いつかなかったです。勉強になりました。 ちなみにOSはFreeBSDでシェルはBashです。 継続してご回答をお待ちしています。

haniwannko
質問者

補足

ls $current/bk と ls $current/bk |tail +11 で同じ結果になるのは変だと思います。後者は tail +11 で「11行目以降」を表示するはずなので。 とありますが、tail +11だと11行目までのような気がします・・それはtail -f +11したときかな・・自信ないですけど、ともかく、結果は同じでした。正確には、どちらも全ディレクトリが羅列されていました。どちらも数は同じでした。 FreeBSDだからシェルの実装?tailの実装?が違うんでしょうかね。。 ナゾです。

関連するQ&A

  • MySQLデータベース自動バックアップ

    CentOS5でMySQLをインストールし、MySQLの全てのデータベースを サーバ内の他のディレクトリにバックアップするためのスクリプトを作成しています。 http://centossrv.com/mysql-backup.shtml このページを見ながらその通りにしているのですが、スクリプトを実行した時に、 ./mysql-backup.sh: line 9: rm: command not found ./mysql-backup.sh: line 10: mkdir: command not found ./mysql-backup.sh: line 12: ls: command not found ./mysql-backup.sh: line 12: grep: command not found というエラーが出て実行ができません。 どのように対処すれば良いでしょうか。

  • データ損失(データ復旧について)

    すみません 使用しているunix(linux)でroot権限でデータを削除してしましました root権限で、打ち込んだコマンドは以下です tr -rf /* と打ち込んでしまいました(ルートからすべてのファイ削除) 途中で、ctrl + cでストップしましたが どの程度、壊れたかを判別できません ブートするとカーネルクラッシュと表示されてしまいます 他のunixにハードディスクをつけてマウントすると ディレクトリはある程度、見えるのですが(/dev,/home etc) ディレクトリは残っているのですが、その中が空です trにおける動作詳細をご存知のかたお教えいただけますでしょうか また、データ復旧会社、ソフトなどおわかりでしたら お願いいたします

  • バックアップスクリプトの作り方

    Linuxシステムに数値計算結果を格納するデータサーバーがあります。 これのバックアップをする仕組みを作りたいのでアドバイス頂けないでしょうか? やりたい内容を以下に記述します。 ■概要 /data/simulation → /data/backup に必要なデータのみコピー ■詳細 /data/simulationは約5TBあります。 内部に100単位の子ディレクトリ、孫ディレクトリもあります。 データが大きすぎて、計算結果本体はバックアップしづらいので 計算結果を再現できるようなデータ(計算条件などの)のみをバックアップしたいです。 ※計算条件だけであれば、5TB中100GB程度で済みます。 処理フローのイメージとしては、 1) バックアップ除外ファイルをリスト化 2) 除外ファイルを除き、ディレクトリ構造を含めて /data/simulationから/data/backupにコピーする ※差分コピーができればベターですが、全上書きコピーでもかまいません。 になります。 素人考えでは、以下のようなシェルスクリプトでできるかなとも思うのですが いかがでしょうか? #!/bin/tcsh foreach dn( `find /data/simulation -type d -print` ) if ( ! -d $dn:s/simulation/backup/ ) mkdir -p $dn:s/simulation/backup/ foreach fn( `ls $dn:s/simulation/backup/*` ) --除外ファイル以外をコピー-- end end 除外ファイルを100種ほど定義しなくてはならないので、処理は遅そうですが、、、。 Windowsであれば、様々なツールで除外ファイルを決められるバックアップソフトで 差分バックアップができますが、このようなツールはLinuxにあるのでしょうか? 使用ディストリビューションはRedHat Enterprize Linux 4です。 X上で動くアプリでいいのがあれば、それで解決してしまうのかもしれません。 以上、助言よろしくお願いいたします。

  • 複数のテキストから同じ行数の文字列を抽出し,別のテキストに出力する方法

    環境:linux,Windows XP よろしくお願いします.以下のようなデータが数千個あります. 2020-01-01_00.txt 2020-01-01,00,109.18970,18.36816,30.618,0.000,91.276,292.712 2020-01-01,00,109.54297,18.39178,30.676,0.000,90.044,292.653 2020-01-01,00,109.89642,18.41394,30.581,0.000,89.560,293.056 ・ ・ ・ ・ 2020-01-01_01.txt 2020-01-01,01,109.18970,18.36816,27.998,350.080,85.071,294.773 2020-01-01,01,109.54297,18.39178,28.187,355.642,86.229,294.425 2020-01-01,01,109.89642,18.41394,28.136,359.157,87.494,294.675 ・ ・ ・ ・ 2020-01-01_02.txt 2020-01-01,02,109.18970,18.36816,30.200,551.398,75.640,296.445 2020-01-01,02,109.54297,18.39178,30.356,556.004,79.117,295.921 2020-01-01,02,109.89642,18.41394,29.953,558.076,82.460,295.942 ・ ・ ・ ・ ここで,私がやりたいのは,同じディレクトリ内にある数千個のテキストから同じ行数の文字列を抽出し,別のテキストファイルに出力することです.つまり,結果の出力は以下のようにしたいのです. 109.18970,18.36816.txt 2020-01-01,00,109.18970,18.36816,30.618,0.000,91.276,292.712 2020-01-01,01,109.18970,18.36816,27.998,350.080,85.071,294.773 2020-01-01,02,109.18970,18.36816,30.200,551.398,75.640,296.445 ・ ・ ・ ・ 109.54297,18.39178.txt 2020-01-01,00,109.54297,18.39178,30.676,0.000,90.044,292.653 2020-01-01,01,109.54297,18.39178,28.187,355.642,86.229,294.425 2020-01-01,02,109.54297,18.39178,30.356,556.004,79.117,295.921 ・ ・ ・ ・ 109.89642,18.41394.txt 2020-01-01,00,109.89642,18.41394,30.581,0.000,89.560,293.056 2020-01-01,01,109.89642,18.41394,28.136,359.157,87.494,294.675 2020-01-01,02,109.89642,18.41394,29.953,558.076,82.460,295.942 ・ ・ ・ ・ 私なりに以下のshを作成しましたが,処理が通りません.間違えているところをご指摘いただけないでしょうか.よろしくお願いします. #!/bin/sh BUFIFS=$IFS IFS= exec 3< lonlat.txt while read FL 0<&3 for i in 2020-??-??_??.txt $data = cat $i | grep "$FL" $i print $data >> ./out/$FL done exec 3<&- IFS=$BUFIFS #lonlat.txtの内容は以下の通り 109.18970,18.36816 109.54297,18.39178 109.89642,18.41394     ・     ・     ・ #処理したものを/outに出力

  • shファイルで、7日以上前の更新日に該当するディレクトリ(ディレクトリ

    shファイルで、7日以上前の更新日に該当するディレクトリ(ディレクトリの中には、サブディレクトリ、ファイルがあります)を削除したいのですが、どのような記述を書けばよろしいのでしょうか? 例)ディレクトリは、以下のイメージです。 ※shファイル実施日が5/8であれば、/20100501をディレクトリごと削除したいです。 /20100501 | ----a.txt,b.txt,c.txt | ----log | | | ----1.log | ----sql | ----1.sql /20100502 | ----a.txt,b.txt,c.txt | ----log | | | ----1.log | ----sql | ----1.sql

  • cronでバックアップsh

    現在、hetemlというレンタルサーバでバックアップ用のシェルをcron登録しているのですが、 権限エラーが出てしまいます。何の権限エラーなのか解らないのですが、 どなたかご存知ないでしょうか? [エラーメッセージ] /bin/sh: /home/sites/heteml/users/xxx/db_bakkup.sh: Permission denied [シェル] #!/bin/sh # ---------- 設定 ---------- # バックアップ元のデータベース db_host=xx db_name=xx db_user=xx db_pass=xx # バックアップ先のディレクトリ・ファイル bk_file=/xx/bak.sql # ---------- ファイル名を設定 ---------- # ファイル名を設定 file_temp=$bk_file.sql # ---------- バックアップ処理 ---------- # バックアップ先のディレクトリに移動 cd $bk_dir if [ $? != 0 ]; then echo "Backup directory does not exist." exit 1 fi # データベースをダンプ mysqldump -h$db_host $db_name -u$db_name -p$db_pass --opt > $bk_file if [ $? != 0 -o ! -e $file_temp ]; then echo "Cannot dump database." exit 1 fi exit 0 ------------------------------------ 有識者の方、ご教授お願い致します。

  • UNIXのディレクトリ再起検索に関して。

    UNIXのディレクトリ再起検索に関して。 【内容】 ディレクトリの再起検索した内容をテキストに出力したいのですが、あるディレクトリの配下はテキストに出力したくないため、除外をしたいのですが、うまくいきません。 以下ディレクトリの構成は添付してあります。 たとえば、ls -laR > a.txtコマンドを実行して、1,2以外のディレクトリ(A,B,C)をa.txtに出力したいのです。 ご教示お願いします。

  • ファイルのデータがうまく読み込まれません

    こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、 #include<stdio.h> #include<math.h> #define MAX 200 /* ファイル"sample.txt"から複数の値を入力し、それらの  平均値、標準偏差を出力する.  */ void main(void) { FILE *fp; char text[256],l[256]; int i, n; float a[MAX], sum,sum2,mean,sdev; fp = fopen("sample.dat","r"); /* sample.txt を開く */ if(fp == NULL){ printf("Error!\n");exit(0);}/* sample.txtがなければ停止 */ for(i = 1; i <= 3; i++) fscanf(fp, "%s\n",text); for(i = 0; i < MAX; i++) { if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; } n = i; sum = a[0]; sum2 = a[0]*a[0]; for(i = 0; i < n; i++) { sum += a [i]; sum2 += a[i]*a[i]; } mean = sum/n; /* 平均値の計算 */ sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */ printf(" mean : %6.2f\n", mean); printf("standard dev.: %6.2f\n",sdev); } で、読み込むファイルは 平均値と標準偏差の計算 クラスA組み 氏名 身長(cm) 鈴木 175.54 佐藤 170.34 清水 165.29 徳田 185.23 赤木 178.61 と、長くなってしまいましたが、if文の中のfscanfの部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?

  • テキストデータから指定行の削除

    phpでサイトを作っています。 テキストデータを一行ずつ表示させ、指定した行を削除したいのですが、どうすればいいのでしょうか? -- data.txt -- aaa,data1, bbb,data1, ccc,data1, ddd,data1, -- php -- <?php $del=$_POST['del_no']; if($del!=""){ $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); if($data_array[0]!=$del){//削除データ以外を再書き込み $txt="$data_array[0],$data_array[1],\n"; $fp = fopen("data.txt", "w"); flock($fp,1); foreach ($txt as $line) {// 1行ずつファイルへ書き込み? fwrite($fp, $line); } fclose($fp); break; } } } ?> <b>data list</b> <? $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); echo "$data_array [0]<br />"; echo "<form method=\"post\">"; <input type=\"hidden\"name=\"del_no\" value=\"$data_array[0]\" />";//削除するデータをPOST echo "<input type=\"submit\" value=\"削除\" />"; echo "</form>"; } ?> こうすると、テキストデータが白紙になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 重複データ削除

    DOSプロンプトでテキストファイルの重複データを削除するコマンドはあるのでしょうか? また、新、旧のデータを持つファイルがあり新データを旧データに上書きする時に重複データは上書きしないコマンドはあるのでしょうか? 今はtype a.txt>>b.txtで実行して重複データを手作業よって削除してます。 どなたかご教授願います。