読者です 読者をやめる 読者になる 読者になる

orz.conf

技術メモ✍

logrotateがうまくいかない

shell linux

今回はシェル(bash)の問題です。
普段全然シェルを書く機会がないくらいの人が対象です。

/etc/logrotate.dのsyslogとかhttpdを設定したはずなのに
うまくlogrotateしてくれない。
(CentOSやRedHatEnterpriseLinuxとか)

初歩的ではありますが、httpd.orgとかsyslog.20150601とかのまま
別ファイルとしてバックアップしておくとその情報でもログローテート
されてしまいます。
(どちらからログローテートされるのかわかりませんが)

なので~~.orgとか~~.日付とかになっているファイルを
.~~.org(又は日付)というドットファイルにするシェルを書いてみよう
というのが今回のお題です。


これをググらずに書きたいところです。

まずshellのfor文の書式

for f in 入力
do
  処理
done

他の言語でいうfor each的な動作です。
各ファイル名は$fとして扱われます。


続いて~~.orgとか~~.日付とかを正規表現で取得
.~~なんてつけてるのはバックアップファイルのみだと判断しています。
なのでこれ

*\.*


リネーム部分ですがドットファイルにするだけなので簡単です。

mv $f \.$f


これを組み合わせると下記のようになります。
普段シェルを使わないと一行目(シバン)ですら忘れてしまうんですよね。

#!/bin/bash
cd /etc/logrotate.d
for f in *\.*
do
	mv $f \.$f
done


これをさらにターミナルから直接実行できるよう一行に書き直してみます。

cd /etc/logrotate.d/;for f in *\.*;do mv $f \.$f;done

改行の箇所に;(セミコロン)を入れるのかと思いきや、doの後には入れません。
それくらいでしょうか。


また間違えて別のディレクトリのファイルを全てドットファイルにしてしまった。
とりあえず全てドットを取り除きたいという場合はどうでしょうか。


まずファイル名置換の方法です。

mv $f ${f/正規表現/置換後}

これを用いてこうなります。

mv $f ${f/\.*/}

後はforのファイル名取得箇所をin \.[0-9a-zA-Z_]*としてやればよいでしょう。

シェルが苦手なのでまたこういった内容のものを書いていきたいと思います。