ファイルが変更されたことを確認する 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

testfile書くときにinotifywait通知を受け取る

例えば。

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"ため避けることができます)またはbash強化でテストしてください。ただし、まったく異なる操作を実行するのではなく、つまりサブシェルで実行してください。stat %ystat %Y[[ ... ]]( ... )

  • ループ間に若干の遅延があるため、システムに完全に負担をかけません。

 #!/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 

関連情報