inotifywait는 새 디렉터리를 무시합니다.

inotifywait는 새 디렉터리를 무시합니다.

시작 시 아직 생성되지 않은 디렉터리를 무시하고 싶습니다 inotifywait. 빈 디렉토리가 있습니다 test.

ubuntu@foo:~$ ls -lah test/
total 8.0K
drwxrwxr-x  2 ubuntu ubuntu 4.0K Sep  5 20:00 .
drwxr-x--- 13 ubuntu ubuntu 4.0K Sep  5 19:56 ..

이것이 내가 inotifywait시작한 방법입니다.

ubuntu@foo:~$ inotifywait -mr -e CREATE -e MODIFY -e DELETE -e MOVE /home/ubuntu/test/ @/home/ubuntu/test/log
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

그런 다음 다른 터미널에서 디렉터리를 만들고 log여기에 콘텐츠를 넣습니다.

ubuntu@foo:~/test$ mkdir log
ubuntu@foo:~/test$ cd log/
ubuntu@foo:~/test/log$ echo "foo" > foo

inotifywait출력 은 다음 과 같습니다 .

/home/ubuntu/test/ CREATE,ISDIR log
/home/ubuntu/test/log/ CREATE foo
/home/ubuntu/test/log/ MODIFY foo

그러나 스크립트를 닫았다가 다시 시작하여 파일에 더 많은 내용을 넣으면 이벤트가 발생하지 않습니다.

inotifywait에서 "곧 생성될" 디렉터리를 무시할 수 있습니까?

답변1

@제외 접두사를 --exclude간단한 패턴(정규식)이 있는 옵션으로 바꾸면 쉽게 수행할 수 있습니다. 예를 들어,

--exclude /home/ubuntu/test/log'$'

$(문자열 끝 일치)를 추가하면 생성된 파일이 test/log2잘못 일치되거나 제외되지 않도록 할 수 있습니다. 또한 ^더 깊은 경로와 일치하지 않도록 시작 부분에 를 추가하세요 .

--exclude '^'/home/ubuntu/test/log'$'

디렉토리를 제외하면 그 아래의 새 파일을 제외하기에 충분합니다.~하지 않는 한이상하게도 해당 디렉토리가 이미 존재합니다. 이 문제를 해결하려면 $대안으로 바꾸십시오. $or /, 즉 ($|/):

--exclude '^'/home/ubuntu/test/log'($|/)'

--exclude그러나 테스트 결과 (내 버전 3.14의 경우?) 마지막 옵션 만 사용된 것으로 나타났는데 , 이는 문서화되지 않았으며 다소 예상치 못한 일입니다. 따라서 여러 디렉터리를 제외하려면 해당 디렉터리를 정규식으로 결합해야 합니다. 구문에 익숙하지 않은 경우 너무 복잡할 필요는 없습니다. ^(...|...|...)($|/)예를 들어 다음과 같이 목록을 안에 넣으세요.

--exclude '^(/home/ubuntu/test/log|/home/abc/log|/usr/def)($|/)'

경로에 특수 정규식 문자가 포함된 경우 .[]^$()*+?|{},해당 문자를 이스케이프 처리하는 방법을 찾아야 합니다.

관련 정보