시작 시 아직 생성되지 않은 디렉터리를 무시하고 싶습니다 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)($|/)'
경로에 특수 정규식 문자가 포함된 경우 .[]^$()*+?|{},
해당 문자를 이스케이프 처리하는 방법을 찾아야 합니다.