私は見たこの回答:
たとえば、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
少なくともバイナリのデフォルトバージョンでは実際のオプションです。
答え3
二重否定方式だが以前の回答(TMGが指摘したように)フィルタリング操作をに切り替えるので良いアイデアですが、inotifywait
これは間違っています。
たとえば、ファイルがas
then で終わる場合、[^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ファイルのみが含まれます。