
背景:これは、テスト環境 (Sybase データベース) にいくつかのテスト データをロードするための一時的な手段です。
毎日データベースにインポートしなければならないファイルがたくさんあります。これらのファイルは次のように整理されています。
30Aug2011/IMPORT_ME.txt
31Aug2011/IMPORT_ME.txt
...
8Sep2011/IMPORT_ME.txt
9Sep2011/IMPORT_ME.txt
各インポート後に、日付を修正するために特別なSQL文を実行する必要があります。これはメインスクリプトで行ったことです。
import_file.sh 20Aug2011/IMPORT_ME.txt
cat rerun_import_file.tmpl | sed -e "s/XXX/8 Aug 2011/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
...
import_file.sh 9Sep2011/IMPORT_ME.txt
cat rerun_import_file.tmpl | sed -e "s/XXX/9 Sep 2011/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
だから私は次のようにすればもっと良くなると思います:
日付パターンに一致するすべてのディレクトリを検索します
日付を正しく並べ替える(セットアップに非常に重要)
日付を解析し、SQLファイルに従って日付を設定します
しかし、私の bash script-fu はそれを実行するには不十分です。
答え1
もちろん、私は質問のソート部分を見逃していました。それに答えるために、いくつかの点でより単純な別のモデルを提案します。
ls */IMPORT_ME.txt | cut -d/ -f 1 | date --file=- +%s | sort -n | sed -e 's/^/@/' \
| while read DATE
do
FILENAME=`date -d ${DATE} +%-d%b%Y/IMPORT_ME.txt`
REPLACEMENT=`date -d ${DATE} +%-d %b %Y`
import_file.sh ${FILENAME}
cat rerun_import_file.tmpl | sed -e "s/XXX/${REPLACEMENT}/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
done
ここで重要なのは、すべてのディレクトリ名(有効性のためにフィルタリングされたもの)を最初にソート可能な時間形式(この場合は Unix の「エポック」時間)に変換し、ソートしてから、(2 つの異なる形式に)戻すことです。
純粋に文字列を操作する以上の意味で日付を扱う場合は、「date」のマニュアル ページを読むことを強くお勧めします。実際、マニュアル ページを 2 回読んで、よく考えてから、もう一度読んでください。「date」は、その分野では非常に強力なコマンドです。
ああ、この経験から学んだ教訓は、常に ISO 形式の日付 (date -Iseconds
またはdate -I
例) を使用する必要があるということだと私は思います。ISO 形式の日付は、たとえば を使用すると文字列として適切に並べ替えられますsort
。