Como usar inotifywait para assistir a um diretório para criação de arquivos de uma extensão específica

11

Eu vi esta resposta .

You should consider using inotifywait, as an example:

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 assiste a um diretório para criação de arquivos de qualquer tipo, mas como modifico o comando inotifywait para relatar somente quando um arquivo de determinado tipo / extensão é criado (ou movido para o diretório diretório) - por exemplo ele deve informar quando qualquer arquivo .xml for criado.

O que eu tentei:

Eu executei o comando inotifywait --help e li as opções da linha de comando. Ele tem comandos --exclude <pattern> e --excludei <pattern> para arquivos EXCLUDE de certos tipos (usando regEx), mas eu preciso de uma forma de INCLUDE apenas os arquivos de um certo tipo / extensão.

    
por Shy 17.11.2016 / 06:37

3 respostas

11

how do I modify the inotifywait command to report only when a file of certain type/extension is created

Por favor, note que este é o código não testado porque não tenho acesso a inotify agora. Mas algo parecido com isso deve funcionar:

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

Use um negativo duplo:

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

Isso só incluirá arquivos javascript

    
por 29.07.2017 / 16:00
0

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.

    
por 25.10.2018 / 12:26