파일이 수정되었는지 확인하기 위해 스크립트를 작성하려고 합니다. 그렇다면 스크립트는 계속 실행되어야 하고 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"
파일 이름에 공백이나 'globbing' 문자가 포함되어 있으면 작동한다는 것입니다.클래식
[ ... ]
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