こんにちは。現場あるあるシリーズです。(あるあるかな。。。?)
現場あるあシリーズ:「ファイル数がたりない!」こんな時どうする?
こうゆう処理をされているシステムはよくあるのではないでしょうか。
①「Input」ディレクトリに格納されているファイルを読み込む
② 読み込んだファイルに何らかの処理を加える
③ 処理を加えた結果をファイル名を一部変更して「Output」ディレクトリに格納する
正常に処理が終了すれば、「Output」ディレクトリには「Input」ディレクトリに格納されているファイルと同じ数の(ファイル名が変更された)ファイルが存在するはずです。
ところが、
あれ?「Output」ディレクトリのファイル数が少ない。
いくつかのファイルが正常に処理されなかったようです。
こうなるとログから現象や原因を調査することになりすが、どのファイルが出力されなかったのかも知りたいところです。
みなさんならどうやって「藁の中の針」を見つけ出しますか?
ちなみに、前に記事に書いたExcelとサクラエディタの使い手の若きリーダーは、ExcelのVLOOKUP関数を使って「存在すべきなのに存在しないファイル」を洗い出していました。
パパッと手が動くのは素晴らしいと思います。
(Excel嫌いな)私はというと、シェルスクリプトで実現する方法を考えてみたのですが、もっとスマートな方法をご存知の方いらっしゃいましたら教えていただきたいです。よろしくお願いします。
シェルスクリプトサンプルコード
今回の例として、処理前のファイルを「Input」ディレクトリに用意しました。
分かりやすくするために処理前のファイルは5つだけです。
$ ls -l ./Input/
total 0
-rw-r--r-- 1 dipolecats admin 0B 6 27 14:21 IN_NAGANO.csv
-rw-r--r-- 1 dipolecats admin 0B 6 27 14:20 IN_OKINAWA.csv
-rw-r--r-- 1 dipolecats admin 0B 6 27 14:20 IN_OSAKA.csv
-rw-r--r-- 1 dipolecats admin 0B 6 27 14:21 IN_SAGAWA.csv
-rw-r--r-- 1 dipolecats admin 0B 6 27 14:19 IN_TOKYO.csv
$ cd ./Input/
$ ls | wc -l
5
何らかの処理後「Output」ディレクトリの格納されたファイルが下記だと想定します。
ファイル名がIN_{任意の文字列}.csvからOUT_{任意の文字列}.csvに変更されています。
$ ls -l ./Output/
total 0
-rw-r--r-- 1 dipolecats admin 0 6 27 14:24 OUT_NAGANO.csv
-rw-r--r-- 1 dipolecats admin 0 6 27 14:24 OUT_OKINAWA.csv
-rw-r--r-- 1 dipolecats admin 0 6 27 14:24 OUT_TOKYO.csv
$ cd ./Output/
$ ls | wc -l
3
そして今回やりたいことは、「Output」ディレクトリに存在すべきなのに存在しない2つのファイルを洗い出すことです。
つまり、「OUT_OSAKA.csv」と「OUT_SAGAWA.csv」ですね。
で、考えたのがこちらのコード。
これで、調査対象のファイルが2,000個だろうが10,000個だろうが直ぐに結果が出ます。
$ for FILE in `ls ./Input/ | sed 's/IN/OUT/'`
> do
> if [ ! -e ./Output/$FILE ];then
> echo $FILE
> fi
> done
OUT_OSAKA.csv
OUT_SAGAWA.csv
コメント