폴더에서 파일 변경 사항 감시

폴더에서 파일 변경 사항 감시

파일 생성, 삭제 및 변경 사항에 대해 폴더를 모니터링하는 스크립트를 작성 중입니다. 이러한 조건 중 하나가 발생하면 사용자에게 알림이 전송됩니다(30초마다).

현재 루프를 사용하여 for디렉터리의 파일을 반복하고 미리 생성된 파일 배열과 비교하고 있지만 새로 추가된 파일과 수정된 파일을 구분할 수 없습니다.

내가 사용하는 코드는 다음과 같습니다.

start()
{
    files=(~/Junk/*)
    while true; do 
        loopstart=$(date +%s)
        watcher
        sleep 15
    done
}

watcher() 
{
    ls -1 ~/Junk
    echo -e "\n"
    for f in ~/Junk/*; do
        if [[ ! "${files[@]}" =~ "$f" ]]; then
            echo -e "\n$f has been added"
        else
            last_modified=$(stat -c %Z "$f")
            if [ $(($loopstart - $last_modified)) -le 15 ]; then
                echo -e "\n$f has been changed"
            fi
        fi
    done

    for f in "${files[@]}"; do
        if [ ! -e "$f" ]; then  
            echo -e "\n$f has been deleted"
        fi
    done

    files=(~/Junk/*)
}

start_watcher

나는 inotify와 다른 시스템이 솔루션을 제공할 수 있다는 것을 알고 있습니다. 단지 Bash 전용 솔루션이 필요합니다.

답변1

다음 출력을 사용할 수 있습니다.

find . -mindepth 1 -maxdepth 1 -type f -printf '%C@ %T@ ' -ls

stat이는 각 파일을 호출하는 것(특히 여러 번)보다 훨씬 빠릅니다. 이상한 파일 이름을 더 잘 처리하는 방법 -printf은 와 의 조합입니다 . -ls이런 일이 일어나지 않을 것이라고 확신한다면 다음을 사용할 수 있습니다.

-printf '%i %C@ %T@ %P'

대신에.

주석 노드에서 언급한 대로 인덱스 노드는 객체를 식별합니다. ctime 및 mtime은 파일 데이터나 메타데이터가 기록되었는지 여부를 알려줍니다(그러나 실제로 변경되었는지 여부는 알 수 없음). 이 데이터를 배열에 써야 합니다.

find ... | while IFS= read ctime mtime inode dummy1 ... dummy9 rest; do ...

반지 모양.

답변2

문제는 스크립트 끝에 있습니다. 수정사항이 포함된 스크립트를 다시 게시하겠습니다.

시작 기능을 실행하려고 하므로 "start_watcher"를 "start"로 변경합니다.

답변3

Auditd를 사용해 보세요

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/chap-system_auditing

필요한 디렉토리를 모니터링하려면

auditctl -w /path/to/dir -p wa -k CHANGED_ON_DIR

관련 정보