파일이 수정되었는지 확인하는 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"파일 이름에 공백이나 'globbing' 문자가 포함되어 있으면 작동한다는 것입니다.

  • 클래식 [ ... ]or test ...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 

관련 정보