inotifywaitを使用してディレクトリ内の特定の拡張子を持つファイルの生成を監視する方法

inotifywaitを使用してディレクトリ内の特定の拡張子を持つファイルの生成を監視する方法

私は見たこの回答:

たとえば、inotifywaitの使用を検討する必要があります。

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

上記のスクリプトは、あらゆる種類のファイルを生成するためのディレクトリを監視します。私の質問は修正する方法ですinotifywait特定のタイプ/拡張子のファイルが作成された場合、またはディレクトリに移動された場合にのみ報告するコマンド。たとえば、.xmlファイルが作成されたら報告する必要があります。

私が試したこと:

コマンドを実行しinotifywait --help、コマンドラインオプションを読みました。それがあり、--exclude <pattern>オプション--excludei <pattern>があります入らないようにする特定の種類のファイル(正規表現を使用)を使用しますが、方法が必要です。含む特定のタイプ/拡張子のファイルのみ。

答え1

inotifywait特定のタイプ/拡張子のファイルが生成されたときにのみ報告するようにコマンドを変更する方法

これはテストされていないコードinotify今はアクセスできないからです。しかし、これに似たものは次のように機能しますbash

inotifywait -m /path -e create -e moved_to |
    while read -r directory action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done

または、いいえbash

inotifywait -m /path -e create -e moved_to |
    while read -r directory action file; do
        case "$file" in
            (*.xml)
                echo "xml file" # Do your thing here!
                ;;
        esac
        fi
    done

最新バージョンでは、inotifywaitファイルに対して直接パターンマッチングを作成できます。

inotifywait -m /path -e create -e moved_to --include '.*\.xml$' |
    while read -r directory action file; do
        echo "xml file" # Do your thing here!
    done

答え2

--include--includei少なくともバイナリのデフォルトバージョンでは実際のオプションです。

https://github.com/inotify-tools/inotify-tools/tree/master

答え3

二重否定方式だが以前の回答(TMGが指摘したように)フィルタリング操作をに切り替えるので良いアイデアですが、inotifywaitこれは間違っています。

たとえば、ファイルがasthen で終わる場合、[^j][^s]$最後の文字がs一致しないため一致しないため[^s]除外されません。

ブールという用語で、if はS次の文です。

「最後の手紙s

そして、J次のような声明があります。

「2番目の文字はj

パラメータの値は--exclude意味的に等しくなければなりませんnot(J and S)。つまり、ドモーガンの法則はいnot(J) or not(S)

もう一つの潜在的な問題は、inがzsh等価$path配列を表す組み込み変数であるため、$PATHそのwhile read path ...行が完全に混乱し、$PATHすべてがシェルで実行できなくなることです。

したがって、正しいアプローチは次のとおりです。

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

.afterは一致が[^j]最後の2番目の位置に適用されることを確認する必要があり、POSIX拡張正規表現が使用されるため、|ここで文字(上記のブールORを表す)をエスケープしないでください。--exclude

しかし、参照してください投票して@エリコチン回答これは最新バージョンへのinotifywaitよりきれいなアプローチです。

答え4

二重不正文を使用してください。

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

これにはJavaScriptファイルのみが含まれます。

関連情報