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