データベースのバックアップをディレクトリ構造に保存します
year/month/day/time/backup_name
例は
basics_mini/2012/11/05/012232/RATIONAL.0.db2inst1.NODE0000.20110505004037.001 basics_mini/2012/11/06/012251/RATIONAL.0.db2inst1.NODE0000.20110505003930.001
バックアップファイルのタイムスタンプは使用できないことに注意してください。自動化テストを開始する前に、サーバー時間は5.5.2011に設定されます
したがって、問題は、コーディングしようとしている関数に「ベースディレクトリ」(basics_mini)を渡した場合に、どのようにして最新のファイルを取得できるかということです。
最新のデータベースを復元する必要があります。私はphpでそれを行いますが、単純なシェルスクリプトソリューションがあるのだろうかと思います。
find 'basics_mini' -type f |
sed 's/.*basics_mini\///' |
sort -t '/' -k1nr -k2nr -k3nr -k4nr |
head -1
これにより、バックアップディレクトリ内のファイルが検索され、sed
が先頭のパスを削除します(year
ディレクトリまで)。次に、並べ替えは「/」のパス名を区切り、フィールド1、2、3、4、つまり年、月、日、時刻で数値の並べ替えを実行します。最後に、 head -1
は出力の一番上の行を返します。
もちろん、これは、同一の最新のエントリが複数ある場合でも、1つのファイルのみを返します(それが懸念される場合)。
検索はあなたのニーズに合うはずです:
find "/path/to/backup_dir" -type f|sort -r|head -n1
これは、(例のように)月と日のフォルダーに先行ゼロがある場合にのみ機能します
特定のファイル名(またはパターン)でバックアップが必要な場合は、検索パラメーターに名前パターンを追加します。
find "/path/to/backup_dir" -type f -name "*db2inst1*"|sort -r|head -n1
...または、大文字と小文字を区別しないパターンには-iname
を使用します
上記のコマンドの詳細について説明します。
find "/path"
は、指定されたパス内のすべてのファイル/ディレクトリを再帰的にリストします(さらにフィルタリングを使用しない限り:-type f
パラメータは、通常のファイルではないものをすべて除外します)-name
または-iname
は特定のパターンに従ってファイルを照合しますsort
は出力を逆の順序でソートします(-r
)head -n1
は、入力の最初の行(-n 1
)のみを出力し、それを実行するとすぐに終了します。この命名スキームでは、最新のバックアップは辞書式順序で最後のサブディレクトリにあります。ワイルドカードが辞書式順序で展開されるという事実を利用して、シェルで直接最新のディレクトリを取得できます。
cd basics_mini
set [0-9][0-9][0-9][0-9]/*/*/*
shift $(($#-1))
echo "The most recent backup is in $1"
Zshでは、glob修飾子を使用して最後のディレクトリを直接取得できます。
echo "The most recent backup is in" basics_mini/[0-9][0-9][0-9][0-9]/*/*/*([-1])
私の解決策はこれを使用することです。可能な限り最新のファイルを出力します。
ls -lcR --full-time | grep '^-' | sort -k 6 -r | head -n 1
説明:
ls -lcR
-l
長いリスト形式を使用する
-c
show ctime(ファイルステータス情報の最終変更時刻)
-R
サブディレクトリを再帰的にリストします
-
(ダッシュ)で始まるファイルの場合はgrep
、つまり「通常のファイル」。
sort -k 6 -r
-k
列nで並べ替え(日付フィールドを保持するため6)
-r
反転
head -n1
-n
表示する行数(上から下へ。1)