ファイルやディレクトリを見つけてソートし、日付を抽出するための効率的なbashスクリプトを作成する方法


0

バックグラウンド: テストデータをテスト環境(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. 日付を解析して、sqlファイル内の日付を設定します。

しかし、私のbash script-fuはそれを実行するのに十分ではありません。

回答:


2

もちろん、私は質問のソート部分を逃しました。それに答えるために、私はいくつかの点でより単純な別のモデルを提案します。

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の「エポック」時刻)に変換し、それらをソートしてから変換することです。

純粋に文字列を操作するという意味以上の日付で作業しているのなら、 'date'のmanページを読むことを強くお勧めします。実際には、それを二度読んで、それについて一生懸命考えて、それからもう一度それを読んでください。 'date'はその分野で非常に強力なコマンドです。

ああ、そして私があなたがこの経験から学んだ教訓はあなたが常にISOフォーマットの日付を使うべきであるということであることを願っています( date -Iseconds または date -I たとえば)。 ISOフォーマットの日付は、例えばを使って文字列としてソートする sort


素晴らしい答えをありがとう!パズルの最後の残りの部分:スクリプトがこれらのIMPORT_ME.txtファイルを正しいディレクトリ順にディレクトリ名で示されているとおりに繰り返すようにするにはどうすればよいですか。たとえば、1Sepが2Augの代わりに1Augの後に来るのを見たくはありません。
Anthony Kong

ああ。それはある意味でそれをより簡単にします。上記の完全に変更された答えを参照してください。
Slartibartfast

@Slartibarfast:素晴らしい解決策!ありがとうございます。
Anthony Kong

このソリューションを使用する際の依存関係は何ですか?私はソラリスの最初の行を乗り越えることができませんでした。私のbash -versionは4.1.17であり、dateコマンドで許可されている唯一のスイッチは-a(時計の調整)と-u(universal / GMT)です。 gdateを使用しても、REPLACEMENT変数の+形式では、空白文字にいくらか敏感です。
Daniel Liston
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.