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.