web-dev-qa-db-ja.com

ディレクトリ構造year / month / date / timeから最新のファイルを取得します

データベースのバックアップをディレクトリ構造に保存します

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でそれを行いますが、単純なシェルスクリプトソリューションがあるのだろうかと思います。

3
Radek
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つのファイルのみを返します(それが懸念される場合)。

2
tojrobinson

検索はあなたのニーズに合うはずです:

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"は、指定されたパス内のすべてのファイル/ディレクトリを再帰的にリストします(さらにフィルタリングを使用しない限り:
  • findの-type fパラメータは、通常のファイルではないものをすべて除外します)
  • -nameまたは-inameは特定のパターンに従ってファイルを照合します
  • sortは出力を逆の順序でソートします(-r
  • head -n1は、入力の最初の行(-n 1)のみを出力し、それを実行するとすぐに終了します。
4
mreithub

この命名スキームでは、最新のバックアップは辞書式順序で最後のサブディレクトリにあります。ワイルドカードが辞書式順序で展開されるという事実を利用して、シェルで直接最新のディレクトリを取得できます。

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)

1
delh