ファイルが変更されたかどうかを確認するスクリプトを記述しようとしています。変更された場合は実行する必要がありますが、変更されて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"
ファイル名に空白や「グロブ」文字が含まれていても機能します。[ ... ]
従来のortest ...
and"$var"
(stat %y
スペースが含まれているため、これは避けるべき)または引用符を必要としないstat %Y
bash 拡張でテストします。ただし、これはまったく異なること、つまりサブシェルで実行します。[[ ... ]]
( ... )
ループ間に多少の遅延があるため、システムを完全に占有することはありません。
#!/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