ファイルとディレクトリを検索して並べ替え、日付を抽出する効率的な bash スクリプトを作成するにはどうすればよいでしょうか?

ファイルとディレクトリを検索して並べ替え、日付を抽出する効率的な bash スクリプトを作成するにはどうすればよいでしょうか?

背景:これは、テスト環境 (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

だから私は次のようにすればもっと良くなると思います:

  1. 日付パターンに一致するすべてのディレクトリを検索します

  2. 日付を正しく並べ替える(セットアップに非常に重要)

  3. 日付を解析し、S​​QLファイルに従って日付を設定します

しかし、私の 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

関連情報