質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

Q&A

解決済

1回答

5087閲覧

シェルスクリプトで、前日のログファイルをリネームして保管したい

umino

総合スコア54

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

0グッド

1クリップ

投稿2020/04/14 06:05

当シェルスクリプトの実行日付と、
とあるログファイルの最終更新日を比較して、
一致しなければログファイル名を前日分としてリネームしたいです。

前提

シェルスクリプト/home/testuser/main.shでは、当スクリプト内でとあるメッセージログを
ログパス/home/testuser/test.logに出力します。

bash

1#!/bin/bash - 2# /home/testuser/main.sh 3 4# ログファイル名を定義 5readonly LOG_FILE="/home/testuser/test.log" 6 7# ログファイルパスへ、ログ出力する 8echo "[$(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(前日の日時)として格納したいです。

該当のソースコード

bash

1#!/bin/bash - 2 3readonly LOG_FILE="/home/testuser/test.log" 4 5# TODO 6if [ ];then 7 # 今回のスクリプト実行時、/home/testuser/test.logの最終更新日より日付が変わっていたら、 8 # /home/testuser/test.logを下記の書式にリネームする 9 # /home/testuser/test.log.yyyy-mm-dd 10fi 11 12echo "[$(date '+%Y/%m/%d %H:%M:%S.%3N')]sampleMsg" | tee -a ${LOG_FILE} > /dev/null 2>&1 13

リネーム自体はmvコマンドでできたのですが、
「今周期で、対象ログの最終更新日から日付が変わっていたら...」という分岐処理ができませんでした。
お詳しい方、どのように実装すればよいかをご教示いただけませんでしょうか?
不勉強で申し訳ないのですが、よろしくおねがいします。

補足情報(FW/ツールのバージョンなど)

Linux
CentOS7
bash

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

常に日付を付けて、日付無しの名前は今日へのシンボリックリンクにするのが簡明で良いと思います。

Bash

1#!/bin/bash - 2 3readonly LOG_FILE=/home/testuser/test.log 4readonly LOG_TODAY=$(date +/home/testuser/test.log.%Y-%m-%d) 5 6ln -sf $LOG_TODAY $LOG_FILE 7 8echo "[$(date '+%Y/%m/%d %H:%M:%S.%3N')]sampleMsg" >> ${LOG_TODAY}

tee -aして出力を捨てるのは意味不明なので、そこは修正してあります。

投稿2020/04/14 06:28

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umino

2020/04/14 08:55

otnさん さっそくのご回答ありがとうございます。 実装して動かしてみましたが、こんなやり方があるのかと、目から鱗でした。 リンクについていまだに慣れなかったのですが、これを機に使ってみようと思います。 また、不要な箇所の添削まで、ありがとうございます。 大変勉強になりました。
otn

2020/04/14 09:10

リネーム方針で行くと、 TIME=($(stat --format %y $LOG_FILE)) if [ "${TIME[0]}" != $(date +%Y-%m-%d) ] then mv $LOG_FILE $LOG_FILE.$(date +%Y-%m-%d) fi ですが、ファイルが無いとエラーになるので、必要ならその考慮も必要です。
umino

2020/04/16 06:05

遅くなりましてすみません。 なるほどですね。ファイルが無いケースは想定しなくてよいので、リネーム方針でいく場合はそちらを参考にさせていただきます。(今回は、リンクになりました) ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問