1

bashでスクリプトを作成しようとしています。このスクリプトは、ファイルが存在しない場合はプロンプトで終了するか、終了する場合は、変更または削除されるとプロンプトで終了します。パラメータ $1 はファイル名用で、パラメータ $2 は各チェック間の時間間隔用です。-N を使用して、ファイルが変更されているかどうかを確認するだけで十分ですか? これまでのコード(作業中のいくつかの小さなエラー):

#!/bin/bash
running=true;
while[ $running ]
do
    if [ ! -f $1 ]; then
    echo "File: $1 does not exist!"
    running=false;
    fi

    if [ -f $1 ]; then

        if [ ! -N $1 ]; then
            sleep [ $2 ]
            fi;

        elif [ -N $1 ]; then
            echo "File: $1 has been modified!"
            running=false;
            fi;

    fi;
done;
4

3 に答える 3

3

GNU stat がインストールされているプラ​​ットフォームのみをターゲットにしていると想定しています。

#!/bin/bash

file="$1"
sleep_time="$2"

# store initial modification time
[[ -f $file ]] || \
  { echo "ERROR: $1 does not exist" >&2; exit 1; }
orig_mtime=$(stat --format=%Y "$file")

while :; do

  # collect current mtime; if we can't retrieve it, it's a safe assumption
  # that the file is gone.
  curr_mtime=$(stat --format=%Y "$file") || \
    { echo "File disappeared" >&2; exit 1; }

  # if current mtime doesn't match the new one, we're done.
  (( curr_mtime != orig_mtime )) && \
    { echo "File modified" >&2; exit 0; }

  # otherwise, delay before another time around.
  sleep "$sleep_time"
done

とはいえ、理想的な世界では、この種のコードを自分で作成することはありません。代わりに、inotifywaitなどのツールを使用すると、はるかに効率的に動作します (状況が変化したときにオペレーティング システムから通知を受ける必要はありません)。定期的にチェックすること。

于 2013-09-01T19:39:54.897 に答える
1

正確ではありません。ファイルの atime と mtime の-N比較を行いますが、これは relatime でマウントされた ext3 ファイルシステムなどでは正確ではありません。OS のファイル監視機能を使用するか、ファイルの mtime を直接比較する必要があります。

于 2013-09-01T19:31:06.507 に答える
0

余談ですが、 running=false; を変更した場合。1、2、3 を終了すると、コードがより明確になり、これを呼び出した別のスクリプトが戻り値を使用して、スクリプトが完了した理由を判断できます。

于 2013-09-01T19:39:41.857 に答える