Embora a abordagem negativa dupla de a resposta anterior seja uma boa ideia, uma vez que (como a TMG observou) realmente desloca o trabalho de filtragem para inotifywait , não está correto.
Por exemplo, se um arquivo terminar em as , ele não corresponderá a [^j][^s]$ porque a letra final s não corresponde a [^s] , portanto não será excluída.
Em termos booleanos, se S for a declaração:
"the final letter is s"
e J é a declaração:
"the penultimate letter is j"
então o valor do parâmetro --exclude deve se igualar semanticamente a not(J and S) , que por leis de De Morgan é not(J) or not(S) .
Outro problema em potencial é que em zsh , $path é uma variável incorporada que representa o equivalente a matriz de $PATH , então a linha while read path ... irá confundir $PATH e fará com que tudo fique instável da casca.
Portanto, a abordagem correta é:
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
Observe o . que é necessário depois de [^j] para garantir que a correspondência seja aplicada na penúltima posição e também que o caractere | (representando o OR booleano mencionado acima) não deve ter escape aqui porque --exclude usa expressões regulares estendidas POSIX.