これ系の話はそっち方面の方々からマサカリとんできそうで怖いのですが、気分転換がてらたまにはいいかなって。
タイトルのとおり。
たとえば「ログファイルが保存されている日付ディレクトリをそれぞれ zip 圧縮したい」というとき、いろんな方法がありますが私はこれが好み、という話です。
で早速ですが、ログフォルダの名前が「2018-05-14」のようなものだった場合、こう。
for row_name in `find . -type d -regextype posix-egrep -regex "./[0-9]{4}-[0-9]{2}-[0-9]{2}"`
do
log_dir=`echo $row_name | tr -d ./`
zip -r ${log_dir}.zip ${log_dir}
rm -rf ${log_dir}
done
「find の正規表現で引っ掛けて for に渡してループ処理する」というもの。
このやり方の利点は
- 「find コマンドに regex というオプションがある」ことだけ覚えておけば、後はその都度ググればいい。
- 普段使ってる正規表現が使える。
- シェルスクリプト書くテイでどうにでもできる。
ということ。
(すこし加齢臭がする手法なことが欠点)
例えば最新の2つは処理対象から外したいなんてときは find の後 sort だの tail だのに渡せばいいだろうし、追加でなにか処理したければループ内でなんでもできる。
あまり小ざかしくなく、シンプルに融通がきくところが気に入っています。
「ログファイルを圧縮って、そんなん td-agent で S3 に上がってんじゃないの?」っておっしゃいますけど、こういうのもまだ必要な場面があるんですよ。