파일이 수정되었는지 확인하는 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 

관련 정보