Pasta de monitoramento para alterações de arquivos

1

Estou escrevendo um script que monitora uma pasta para qualquer criação, exclusão e alteração de arquivos. Quando um desses acontece, o usuário é notificado (a cada 30 segundos).

Atualmente, estou usando for loops para percorrer os arquivos no diretório e compará-los a uma matriz de arquivos criados antes, mas não posso diferenciar entre os novos arquivos que estão sendo adicionados e os que foram modificados.

O código que estou usando é o seguinte.

start()
{
    files=(~/Junk/*)
    while true; do 
        loopstart=$(date +%s)
        watcher
        sleep 15
    done
}

watcher() 
{
    ls -1 ~/Junk
    echo -e "\n"
    for f in ~/Junk/*; do
        if [[ ! "${files[@]}" =~ "$f" ]]; then
            echo -e "\n$f has been added"
        else
            last_modified=$(stat -c %Z "$f")
            if [ $(($loopstart - $last_modified)) -le 15 ]; then
                echo -e "\n$f has been changed"
            fi
        fi
    done

    for f in "${files[@]}"; do
        if [ ! -e "$f" ]; then  
            echo -e "\n$f has been deleted"
        fi
    done

    files=(~/Junk/*)
}

start_watcher

Estou ciente do inotify e de outros sistemas que fornecerão uma solução; Eu só preciso de uma solução somente de Bash.

    
por Alphala7 29.10.2017 / 06:00

3 respostas

1

Você pode usar a saída de

find . -mindepth 1 -maxdepth 1 -type f -printf '%C@ %T@ ' -ls

que é muito mais rápido do que chamar stat (especialmente várias vezes) por arquivo. A combinação de -printf e -ls tem um tratamento melhor de nomes de arquivos estranhos. Se você pode ter certeza de que esses não ocorrerão, então você pode usar

-printf '%i %C@ %T@ %P'

em vez disso.

O inode (como mencionado nos comentários) identifica o objeto. O ctime e o mtime informam se os dados ou metadados do arquivo foram gravados (não informam se realmente foram alterados). Você deve gravar esses dados em matrizes em um

find ... | while IFS= read ctime mtime inode dummy1 ... dummy9 rest; do ...

loop.

    
por 29.10.2017 / 11:49
0

A questão é o final do script. Vou repassar seu roteiro com a correção.

altere "start_watcher" para "start" já que você está tentando executar a função start.

    
por 12.02.2018 / 20:03
0

Tente usar o Auditd

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/chap-system_auditing

Para monitorar um diretório, você precisa

auditctl -w /path/to/dir -p wa -k CHANGED_ON_DIR
    
por 12.02.2018 / 20:08