質問: 当シェルスクリプトの実行日付と、 とあるログファイルの最終更新日を比較して、 一致しなければログファイル名を前日分としてリネームしたいです。 ### 前提 シェルスクリプト`/home/testuser/main.sh`では、当スクリプト内でとあるメッセージログを ログパス`/home/testuser/test.log`に出力します。 ``` #!/bin/bash - # /home/testuser/main.sh # ログファイル名を定義 readonly LOG_FILE="/home/testuser/test.log" # ログファイルパスへ、ログ出力する echo "[$(date '+%Y/%m/%d %H:%M:%S.%3N')]sampleMsg" | tee -a ${LOG_FILE} > /dev/null 2>&1 ``` なお、`/home/testuser/main.sh`は、 30秒ごとにcronで実行します。 crontab -l `* * * * * for i in 0 30;do (sleep ${i} ; /home/testuser/main.sh) & done` ### 実現したいこと 日付が変わって1回目のcron実行時に、 `/home/testuser/main.sh`内で ログ出力していた前日の `/home/testuser/test.log`をリネームし、同ディレクトリに `/home/testuser/piyo.log.yyyy-mm-dd`(前日の日時)として格納したいです。 ### 該当のソースコード ``` #!/bin/bash - readonly LOG_FILE="/home/testuser/test.log" # TODO if [ ];then # 今回のスクリプト実行時、/home/testuser/test.logの最終更新日より日付が変わっていたら、 # /home/testuser/test.logを下記の書式にリネームする # /home/testuser/test.log.yyyy-mm-dd fi echo "[$(date '+%Y/%m/%d %H:%M:%S.%3N')]sampleMsg" | tee -a ${LOG_FILE} > /dev/null 2>&1 ``` リネーム自体はmvコマンドでできたのですが、 「今周期で、対象ログの最終更新日から日付が変わっていたら...」という分岐処理ができませんでした。 お詳しい方、どのように実装すればよいかをご教示いただけませんでしょうか? 不勉強で申し訳ないのですが、よろしくおねがいします。 ### 補足情報(FW/ツールのバージョンなど) Linux CentOS7 bash
回答: 常に日付を付けて、日付無しの名前は今日へのシンボリックリンクにするのが簡明で良いと思います。 ``` #!/bin/bash - readonly LOG_FILE=/home/testuser/test.log readonly LOG_TODAY=$(date +/home/testuser/test.log.%Y-%m-%d) ln -sf $LOG_TODAY $LOG_FILE echo "[$(date '+%Y/%m/%d %H:%M:%S.%3N')]sampleMsg" >> ${LOG_TODAY} ``` `tee -a`して出力を捨てるのは意味不明なので、そこは修正してあります。