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)($|/)'

パスに特殊な正規表現文字が含まれている場合は、.[]^$()*+?|{},その文字をエスケープする方法を見つける必要があります。

関連情報