ファイルが変更されたことを確認するスクリプトを作成しようとしています。そうであれば、スクリプトは引き続き実行され、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"
ため避けることができます)またはbash強化でテストしてください。ただし、まったく異なる操作を実行するのではなく、つまりサブシェルで実行してください。stat %y
stat %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