このページでは、お便利サーバー.com管理人宅の地デジテレビREGZA Z2000録画データ自動消去するスクリプトについて解説しています。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
SambaとREGZA Z2000

地デジTV「REGZA Z2000」

LANをREGZA用に改良する

録画用ハードディスクの追加

番組録画用共有ポイント作成

番組の録画データを解析する

録画からの期間で自動消去

使用ディスク容量で自動消去

ビデオ&写真の共有ポイント

REGZAチューナーD-TR1追加


空き容量を確保しながら番組を自動消去する

計画倒れに終わった「ゴミ箱方式 録画データの保存期間で削除するスクリプト 」の反省を元に、新しい自動消去 スクリプト を作成することにしました。つまり、

・共有ポイントの数は 一つだけ にして家族が悩まないようにする。

・録画データを自動で移動するような、家族が 直感的に解りにくい処理 を行わないようにする。

というコンセプトです。

考えてみれば録画に利用する ハードディスク は500 GB ですから、BSデジタル放送でも50時間近くは録画できることになります。

つまりこれだけ録画できるのであれば一か月分くらいの番組は格納できるはずですし、録画して一ヶ月見なければ「録画したものの見るつもりがなくなった。」ということになるわけですから、保存版だの何だのと考える必要もないはずです。

そこで、共有ポイントの使用容量が一定量を超えたら自動的に古い録画データから削除するスクリプトを作成しました。

#!/bin/bash                     ←スクリプト用シェルの宣言
cd /REGZA/rec/ &&                 ←カレントディレクトリの移動

if !( smbstatus -L | grep /REGZA/ > /dev/null );     1.REGZAのアクセス判定
then

declare -i dulimit
dulimit=350000               2.共有ポイントの使用容量の上限の設定

declare -i duvalue
duvalue=`du . -sm | cut -f1`      3.共有ポイントの使用容量を変数に読み込み

 while [ $duvalue -gt $dulimit ];   4.使用容量の上限値と現在の使用容量を比較
 do
 fname=`ls -t | grep .dtv$ | tail -1`      5.一番古い"*.dtv"を変数に代入

  if [ $fname ];           6.録画データが見つからないときの条件分岐
  then

  mv -fv $fname ../del_temp/ | cut -b2-18
  mv -f $fname.rat ../del_temp/
  mv -f $fname.meta ../del_temp/  7.削除対象録画データの"del_temp/"への移動

  duvalue=`du . -sm | cut -f1`   8.共有ポイントの使用容量を変数に再読み込み

  else
  echo "No Video DATA"
  duvalue=0               9.録画データが見つからないときの処理

  fi

 done

rm -f ../del_temp/*                  10.録画データを削除する

fi

使用容量が一定量を超えたら録画データを消去するスクリプト"video_del.sh"

このスクリプトを利用するにあたっては、ゴミ箱方式 録画データの保存期間で削除するスクリプト の場合に必要だった "trush/"(ゴミ箱) "save/"(保存用) などの共有ポイントは必要なく、 "/REGZA/rec" 以外の共有ポイントは使用しません。

REGZA Z2000に録画機器はひとつだけ
REGZA Z2000に録画機器はひとつだけ

これなら子供でもREGZA Z2000上での録画機器の選択に悩むことはないはずです。

もちろんREGZA Z2000からの ロック 操作が効かないのは前と同じですから REGZA Z2000のリモコン操作による録画番組のロック 、それに頼らない録画番組の保存の仕組みは必要になります。

ただ、ゴミ箱方式を引き継いで "保存フォルダ/" をそのまま利用することにします。

ただ、このスクリプトは "/REGZA/rec/" より下のディレクトリには働きませんから、適当なディレクトリを作ればそこが自動的に「保存用フォルダ」として使えることになります。

これならゴミ箱方式のときのように録画データの移動などで保存場所がわからなくなったりすることはないでしょう。

というわけで "/REGZA/" のディレクトリ構成は以下のように非常にシンプルになりました。

スクリプトvideo_del.shを利用するためのディレクトリ構成
スクリプト"video_del.sh"を利用するためのディレクトリ構成

録画データの削除用のテンポラリディレクトリ "del_temp/" が必要なのはゴミ箱形式のときと同じです 番組消去用テンポラリディレクトリdel_tempについて

以下スクリプト内容の説明ですが、このスクリプトはディレクトリ "/REGZA/rec/" 内だけでほとんどの動作を行うので、最初に、

cd /REGZA/rec/ &&                 ←カレントディレクトリの移動

と記述し、スクリプト中の パス 表記ができるだけ単純になるよう工夫しています。

1.REGZA Z2000の録画・再生中を判定する

1. はREGZA Z2000の動作とこの スクリプト の動作が干渉しないようにするための判定です。

if !( smbstatus -L | grep /REGZA/ > /dev/null );     1.REGZAのアクセス判定
then
.
.
.
fi

意味は REGZA Z2000の録画・再生中の判定方法について と同じですので参照してください。

2.共有ポイントの使用容量の上限の設定

2. "/REGZA/rec/" 以下に保存する番組の録画データの合計容量の上限を設定します。

declare -i dulimit
dulimit=350000               2.共有ポイントの使用容量の上限の設定

現在録画に使用しているのは500 GB の専用ハードディスクです 録画用ハードディスクの追加 。このうちどれだけの容量を使用したら古い番組データの削除を行うか、という判断基準になる値です。

このハードディスクは LinuxOS の管理上440GBですので、その約80%である350GBを初期値として設定しています。

ちなみに、 bash シェル スクリプト で扱う変数は 文字列型 が基本ですので、 "declare -i" で変数 "dulimit" を強制的に 整数型 として宣言します。

また、この数値は du コマンド "-m" オプションで出力した数値と比較しますから MB の値として "350000" と設定します。

3.共有ポイントの使用容量を変数に読み込み

3. du コマンド の出力結果を 整数型 として読み込む部分です。

declare -i duvalue
duvalue=`du . -sm | cut -f1`      3.共有ポイントの使用容量を変数に読み込み

既にこの スクリプト の冒頭で cd コマンド を使って録画用共有ポイント "/REGZA/rec/" に移動していますから、 "du . -sm" と実行することで、ディレクトリ "/REGZA/rec/" の使用容量を「その階層以下の合計容量のみを MB 単位で」 標準出力 します。

ただし実際の出力結果は

[root@web0 rec]# du . -smEnter
306110 .
[root@web0 rec]#

となり、整数型変数に読み込むには カレント ディレクトリ表記 "." が余分です .によるカレントディレクトリ表記について

そこでこの出力結果から数値部分(つまり使用容量MB)を取り出すために パイプ処理 パイプ処理について "cut -f1" に処理を渡し、 「一つ目のフィールドだけを出力」 としています。

つまりこの例では変数 "duvalue" "306110" が代入されることになります。

4.使用容量の上限値と現在の使用容量を比較する

4. "while" 文を使った制御ループです。

 while [ $duvalue -gt $dulimit ];   4.使用容量の上限値と現在の使用容量を比較
 do
.
.
.
 done

"while" に続く条件式は

「変数"duvalue(実際のディスク使用容量 3. )"が"dulimit(共有ポイントの使用容量の上限 2. )"よりも大きいときに真。」

という設定になっていて、この条件を満たす場合に に "do〜done" 内を実行します。

この "do〜done" には、 "/REGZA/rec/" の中の録画データを一つずつ "/REGZA/del_temp/" に移動させる処理が記述してあり、一つ移動処理を行うごとにこの条件式に当てはめて、共有ポイントの使用容量 "duvalue" が共有ポイントの使用容量の上限値 "dulimit" を下回るまで "while" のループが繰り返されます。

5.一番古い"*.dtv"を変数に代入

5. "/REGZA/rec/" ls コマンド によるファイル一覧の出力結果を、パイプ処理 パイプ処理について grep コマンドと tail コマンドを使って一番古い録画データのファイル名 "*.dtv" を変数 "fname" に代入します。

 fname=`ls -t | grep .dtv$ | tail -1`      5.一番古い"*.dtv"を変数に代入

lsコマンドを "-t" オプション付きで実行すると、ファイルの タイムスタンプ の新しい順に 標準出力 しますが、この出力は三種類の録画用ファイル名が混ざっていますから REGZA Z2000の録画データの構造について 、grepコマンドででフィルタをかけて録画データの本体ファイルである "*.dat" だけを出力します。

ちなみにここでフィルタ文字列を ".dtv" と指定すると、 "*.dtv" だけではなくて "*.dtv.meta" "*.dtv.rat" も該当してしまいますから、末尾を意味する機能文字 "$" を使って ".dtv$" と指定して 「".dtv"で終わる文字列を含む行。」 を抽出してやります。

そして更に"tail -1"で一番最後の行だけを抜き出してやれば、

「録画開始時刻が一番古い録画データの本体ファイル名"*.dat"。」

を変数 "fname" に代入することができるわけです。

ところで同じ処理はgrepコマンドを使わずに、

 fname=`ls -t *.dtv | tail -1`

でも良さそうに思えます。

しかしlsコマンドは ワイルドカード を指定した場合、該当するファイルが見当たらないとエラーになりますから、 録画データがひとつもない場合に にこのコマンドが実行されるとスクリプトがエラーメッセージを出力してしまいます。

もちろん実用上はこれでも問題ないのですが、エラーは出さないに越したことはないのであえてgrepコマンドで処理しているというわけです。

6.9.録画データが見つからないときの処理

"/REGZA/rec/" に録画データが最初から存在しないとき、あるいは "while" ループが何度か回った結果、録画データがなくなってしまったとき、 5. で変数 "fname" に代入されるのは 空白文字列"" となります。

変数"fname"はこれから削除すべき録画データファイルを指定するためのファイル名が入力されるべきものですが、ここが空白文字列になってしまうと後に実行される録画データファイルの移動コマンド、

  mv -fv $fname ../del_temp/ | cut -b2-18

が、

  mv -fv ../del_temp/ | cut -b2-18

となってしまうため、引数が足りずに書式エラーになってしまいます。

そこで、この 6. で変数"fname"の内容が空白文字列かどうかを判定し、空白文字列の場合に移動コマンドを実行させないように制御します。

  if [ $fname ];           6.録画データが見つからないときの条件分岐
  then
  .
  .
  else
  echo "No Video DATA"
  duvalue=0               9.録画データが見つからないときの処理

  fi

この "if" 文は、変数"fname"が空白文字列の場合に限って となり、 "then" 以降がスキップされて "else" 以降が実行されます。

つまり、 "No Video DATA" を出力して録画データがないことをレポートし、変数 "duvalue" "0" を代入するわけですが、これにより 4. "while" ループの条件式が必ず になってループが終了することになります。

7.削除対象録画データの"del_temp/"への移動

7. では mv コマンド で、 "/REGZA/rec/" 以下で削除されるべきデータを、いったん "/REGZA/del_temp/" に移動します。

直接削除してしまわない理由は 共有ポイントの録画データを直接削除しない理由 のとおりです。

  mv -fv $fname ../del_temp/ | cut -b2-18
  mv -f $fname.rat ../del_temp/
  mv -f $fname.meta ../del_temp/  7.削除対象録画データの"del_temp/"への移動

mvコマンドに "-f" オプションを付けているのは、移動するファイルが存在しないときにエラーを出させないようにするためです。

一行目のmvコマンドにだけ "-v" オプションを付けているのは、移動された "*.dtv" プロンプト やレポートメールで確認できるように 標準出力 するためです。

しかしこの出力をmvコマンドだけで行うと、

`M0198006e200712160015b791753d.dtv' -> `../del_temp/M0198006e200712160015b791753d.dtv'
`M0198006f200712160015b791753d.dtv' -> `../del_temp/M0198006f200712160015b791753d.dtv'
`M01980070200712160015b791753d.dtv' -> `../del_temp/M01980070200712160015b791753d.dtv'

と、「どのファイルが何処に移動されたか。」までご丁寧にレポートしてくれますが、実際に知りたいのは「どのファイルが移動されたか」だけで構いません。

そこでパイプ処理 パイプ処理について cut コマンドに処理を移し、 "-b2-18" で「各行の先頭から2文字目から18文字目までを表示。」というフィルタをかけ、

M0198006e20071216
M0198006f20071216
M0198007020071216

と、ファイル名の主要な部分だけを表示するようにしているわけです。

8.共有ポイントの使用容量を変数に再読み込み

内容は 3. とまったく同じで、 du コマンド の出力結果で変数 "duvalue" の値を更新します。

  duvalue=`du . -sm | cut -f1`   8.共有ポイントの使用容量を変数に再読み込み

つまり、更新された "duvalue" の値でもう一度 4. の条件式と比較して、 "dulimit" の値より小さくなっていれば 4. のループを終了し、まだ大きければもう一度ループを実行する、という具合になります。

10.録画データを削除する

10. "/REGZA/del_temp/" 以下に集められた録画データをまるごと削除します。

rm -f ../del_temp/*                  10.録画データを削除する

rmコマンドに "-f" オプションを付けているのは、削除するファイルが存在しないときにエラーを出させないようにするためです。

このページの先頭へ↑

裏方のスクリプトとはかくあるべきですね

作成した シェル スクリプト "video_del.sh" というファイル名で保存しました。

このスクリプトは "root" でのみ実行しますから、所有者と所有グループを "root" にして chmod コマンド パーミッション "700" にしました。

そして "/etc/cron.daily/" に放り込んで終了です。

このスクリプトが稼動し始めると、REGZA Z2000で "REC(WEB0)" に録画した番組は ハードディスク の空き容量が約100 GB を切ると、古い録画データから自動的に削除されるようになります。

この100GBという容量は、BSデジタル放送で約10時間、地デジで15〜17時間、従来画質(SD)放送で30時間くらいに相当します。

年末年始の超ロング放送の特番でもせいぜい数時間ですから、常にこのくらい空き容量が維持できていれば問題はないでしょう。

スクリプト内で実行される du コマンドは "/REGZA/rec/" 以下の使用容量の合算を出力するので、 "保存フォルダ/" に移動してもこの出力は変化しません。

消されたくない番組はレグザリモコンを使って "保存フォルダ" に移動しておけばOKです。

お便利サーバー.com宅のREGZA Z2000の録画状況
お便利サーバー.com宅のREGZA Z2000の録画状況

つまりこのスクリプトの稼動にあたって、メカ音痴の家族に教えるべきことは、

「ハードディスクが足りなくなったら古い番組は消されるからね。」

「消されたくなかったら保存フォルダに移動しておくように。」

の二つだけです。楽勝です。

また、前回作成した "video_move.sh" 録画からの期間で自動消去 では録画機器として三つを登録する必要があったのですが、この "video_del.sh" では録画機器は一つだけで済みます。

更に、「保存フォルダ」に移動しておいた番組はそのうち「SAVE」に移動している、といったややこしい処理は行いません。「保存フォルダ」に移動した番組はそのまんま「保存フォルダ」に居座りますから、「あれっ?何処に行った?」ということもないでしょう。

というわけでこのスクリプトは、

「空き容量を確保するために、不要になった録画番組をいちいち消さなくてもいい。」

というとってもありがたい機能を提供しつつ、その スクリプトの存在を意識しなくて良い というシェルスクリプトのお手本のようなものになりました。

NEC「得選街」
このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System