ファイルが変更されたかどうかを確認する Bash スクリプト

ファイルが変更されたかどうかを確認する Bash スクリプト

ファイルが変更されたかどうかを確認するスクリプトを記述しようとしています。変更された場合は実行する必要がありますが、変更されてecho "Error!"いない場合はスクリプトが実行され続けます。

私の脚本

#!/bin/bash
date=$(stat -c %y)$1
while true
         do date2=$(stat -c %y$1)
                if (date2 != date)
                        echo "error!"
        done

エラーはありますか?

答え1

、を使用できますinotifywait続きを読む

inotifywait - inotify を使用してファイルの変更を待機します

inotifywait は Linux の inotify(7) インターフェースを使用してファイルの変更を効率的に待機します。シェル スクリプトからのファイルの変更を待機するのに適しています。イベントが発生すると終了するか、継続的に実行してイベントが発生するたびに出力することができます。

このコマンドを使用します:

$ inotifywait -m -e modify /tmp/testfile

私が書くときtestfileinotifywait私に警告する

例えば;

echo "bh" > /tmp/testfile

inotifywaitこのメッセージを表示します:

$ inotifywait -m -e modify /tmp/testfile
Setting up watches.  
Watches established.
testfile MODIFY 
testfile MODIFY 

また、出力を次のwhileステートメントにリダイレクトすることもできます:

while read j
do
   echo "file changed"
   break
done <  <(inotifywait -q -e modify /tmp/testfile)

答え2

filename="$1"

m1=$(md5sum "$filename")

while true; do

  # md5sum is computationally expensive, so check only once every 10 seconds
  sleep 10

  m2=$(md5sum "$filename")

  if [ "$m1" != "$m2" ] ; then
    echo "ERROR: File has changed!" >&2 
    exit 1
  fi
done

答え3

実際のコンテンツの違いではなく、変更タイムスタンプの変更を「手動で」確認したい場合は、次のものが必要です。

  • stat -c %y $1一貫して仕切りスペースと内部 $( ... )さらに良いことに、stat -c %y "$1"ファイル名に空白や「グロブ」文字が含まれていても機能します。

  • [ ... ]従来のor test ...and "$var"stat %yスペースが含まれているため、これは避けるべき)または引用符を必要としないstat %Ybash 拡張でテストします。ただし、これはまったく異なること、つまりサブシェルで実行します。[[ ... ]]( ... )

  • ループ間に多少の遅延があるため、システムを完全に占有することはありません。

 #!/bin/bash 
 date=$(stat -c %y "$1")
 while sleep 1; do date2=$(stat -c %y "$1")
   if [[ $date2 != $date ]]; then echo "changed!"; break; fi
   # possibly exit [status] instead of break
   # or if you want to watch for another change, date=$date2
 done

答え4

md5sum の使用を検討してください。実際のファイルの変更を確認する方が安全です。このスクリプトは、ファイルが他のファイルと異なる場合に「ファイルが異なります」と返しますが、その後均等化すると、ファイルは再び等しいと表示されます。

#!/bin/bash

loop1(){
while sleep 1 
        do 
               md5f1=$(md5sum "$1" | cut -d' ' -f1) 
               md5f2=$(md5sum "$2" | cut -d' ' -f1)
               if [ "$md5f2" != "$md5f1" ]; then 
                    echo "The files are different now." 
                    #stop loop:
                    break 
               fi
        done
}

loop2(){ 
while sleep 1 
        do 
               md5f1=$(md5sum "$1" | cut -d' ' -f1) 
               md5f2=$(md5sum "$2" | cut -d' ' -f1)
               if [ "$md5f2" == "$md5f1" ]; then 
                    echo "The files are equal again." 
                    #stop loop:
                    break 
               fi
        done
}

while true; do 
   loop1 "$1" "$2"
   loop2 "$1" "$2"
done

これを自動比較として保存し、次のように実行します。

./autocompare file1 file2 

関連情報