Tenha um script de shell.
#!/bin/sh
inotifywait --monitor --format="%e %f" --event=create,moved_from,moved_to,delete $directory |
while read event file
do
case "$event" in
# asterisks needed because directory events end in ",ISDIR"
(CREATE*)
echo "$(date +%s) $file" >>"$index"
;;
(MOVED_TO*)
# moved_to includes overwrites, so we have to grep out the file, to make sure it wasn't already there
# use 'sponge' to enable safe reading and writing of the index in the same pipeline
grep -Fv " $file" "$index" | sponge "$index"
echo "$(date +%s) $file" >>"$index"
;;
(MOVED_FROM*|DELETE*)
grep -Fv " $file" "$index" | sponge "$index"
;;
esac
done
Os acessos e modificações de arquivos são ignorados e não alteram o índice; no entanto, se você renomear um arquivo, seu registro de data e hora será atualizado.
Nunca há necessidade de sort
do índice; nós só adicionamos novos arquivos ao final do índice e os removemos do meio.
inotifywait
, conforme chamado no script, ouve eventos de arquivo e gera o tipo de evento, um espaço, o nome do arquivo ou diretório que causou o evento e uma nova linha. Você pode substituí-lo por um programa equivalente.
sponge
simplesmente lê todas as entradas de stdin
em um buffer interno e as grava em um arquivo. Você pode substituí-lo por um equivalente ou, alternativamente, gravar a saída para ${index}.new
e, em seguida, mv -f "${index}.new" "$index"
.
date +%s
exibe a data e hora atuais como o número de segundos da Epoch. Essa invocação funciona com GNU e BSD date
s. Você pode alterar o formato (por exemplo, date '+%F %T'
) para um índice legível ou substituir date
por um equivalente.