指定ファイルの更新時に通知してくれるスクリプト【シェルスクリプト】

どうも、ねこきち(@nekokichi1_yos2)です。

 

とある企業のコーディング課題で、ファイルを監視する問題が出て、シェルスクリプトで実装しました。

 

備忘録として投稿します。

 

動作環境

  • MacBookAir(M1 2020)
  • macOS Monterey 12.1
  • /bin/zsh

 

仕組み

監視対象のファイルパスを取得

監視したいファイルのパスを用意。

シェルの実行ファイル(.sh)と同じ箇所なら、ファイル名だけで良い。

filePath="xxxx/yyyy/zzzz"

 

変更日時を取得

ls -l -T、で対象ファイルの属性情報を取得。

-rw-r--r--@ 1 ユーザ名  staff  99  4 10 12:08:50 2022 ファイル名
last=`ls -l -T $filePath | awk '{print $6"月"$7"日"$8}'`

 

監視開始

while文で実行し続け、1秒度に監視。

while true; do
        sleep 1
... done

 

最新の変更日時を取得

1秒後の更新日時を取得。

current=`ls -l -T $filePath | awk '{print $6"月"$7"日"$8}'`

 

変更日時、現在の変更日時を比較

もし1秒前と1秒後でタイムスタンプが違えば、変更がされているので、処理を実行。

今回だと、"updated: $current"、と出力

if [[ $last != $current ]] ; then
        echo "updated: $current"
... fi

 

変更日時を更新

変更されるたびに最新の更新日時を取得

last=$current

 

実行結果

xxxx@xxxx ディレクトリ % ./test.sh

updated: 4月10日11:42:53

updated: 4月10日11:44:51

 

ソースコード

filePath="ファイルのパス"
last=`ls -l -T $filePath | awk '{print $6"月"$7"日"$8}'`
while true; do
        sleep 1
        current=`ls -l -T $filePath | awk '{print $6"月"$7"日"$8}'`
        if [[ $last != $current ]] ; then
                echo "updated: $current"
                last=$current
        fi
done

 

参考

qiita.com

mizti.hatenablog.com

qiita.com

atmarkit.itmedia.co.jp

ritchiekotzen.hatenablog.com