Eu já vi essa resposta .
Você deve considerar o uso de inotifywait, como um exemplo:
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
Minha pergunta é que, o script acima observa um diretório para criação de arquivos de qualquer tipo, mas como modifico o inotifywait
comando para reportar apenas quando um arquivo de determinado tipo / extensão é criado (ou movido para o diretório) - por exemplo, deve relatório quando qualquer .xml
arquivo é criado.
O QUE TENTEI:
Eu executei o inotifywait --help
comando e li as opções da linha de comando. Possui --exclude <pattern>
e --excludei <pattern>
comandos para EXCLUIR arquivos de certos tipos (usando regEx), mas eu preciso de uma maneira de INCLUIR apenas os arquivos de um determinado tipo / extensão.
path
acima provavelmente não é o melhor nome de variável se você quiser brincar com isso primeiro em um shell. Se você usá-lo, não poderá usar comandos e tudo mais, pois isso basicamente substituiu o padrãoPATH
. Por isso, recomendo usar um nome de var alternativo, como emfpath
vez disso. ou sejawhile read fpath action file
, qualquer comando padrão normalmente disponível no seu shell ainda será.Respostas:
Observe que este é um código não testado, pois não tenho acesso
inotify
no momento. Mas algo parecido com isso deve funcionar:fonte
incron
(espero que não).inotify
, quer comnohup
ou iniciá-lo com o serviço de um systemd personalizado. Na maioria das vezes o último.Use um duplo negativo:
Isso incluirá apenas arquivos javascript
fonte
inotifywait
vez de gerar uma saída enorme para todos os arquivos e filtros posteriormente (como na outra resposta). Ainda não tentei, mas acho que seria um pouco mais rápido.--exclude
entrada para observar.ext
arquivos. Isso é executado apenas uma vez ou em um loop for?inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done
Tenho certeza que o regex pode ser otimizado, mas este bebê funciona :)Embora a abordagem dupla negativa da resposta anterior seja uma boa idéia, já que (como o TMG observou) de fato muda o trabalho de filtragem para
inotifywait
, ela não está correta.Por exemplo, se um arquivo terminar
as
, ele não corresponderá[^j][^s]$
porque a letra finals
não corresponde[^s]
, portanto, não será excluída.Em termos booleanos, se
S
é a instrução:e
J
é a declaração:então o valor do
--exclude
parâmetro deve ser semanticamente igual anot(J and S)
, o que pelas leis de De Morgan énot(J) or not(S)
.Outro problema potencial é que in
zsh
,$path
é uma variável interna que representa a matriz equivalente a$PATH
, de modo que awhile read path ...
linha estraga completamente$PATH
e faz com que tudo se torne não executável a partir do shell.Portanto, a abordagem correta é:
Observe o
.
que é necessário depois[^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 ser escapado aqui, porque--exclude
utiliza expressões regulares estendidas do POSIX.fonte