Carpeta de monitoreo para cambios de files

Estoy escribiendo un script que supervisa una carpeta para cualquier creación, eliminación y cambio de files. Cuando ocurre uno de estos, se notifica al usuario (cada 30 segundos).

Actualmente, estoy usando loops para examinar los files en el directory y compararlos con una matriz de files creados de antemano, pero no puedo diferenciar entre los nuevos files que se agregan y los que se han modificado.

El código que estoy usando es el siguiente.

 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 

Conozco inotify y otros sistemas que proporcionarán una solución; Solo necesito una solución Bash-only.

Puedes usar la salida de

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

que es mucho más rápido que llamar a stat (especialmente varias veces) por file. La combinación de -printf y -ls tiene un mejor event handling nombres de files extraños. Si puede estar seguro de que tales no ocurrirán, puede usar

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

en lugar.

El inodo (como se menciona en los comentarios) identifica el object. El ctime y el mtime le dicen si los datos del file o los metadatos se han escrito (aunque no le dicen si realmente ha cambiado). Debería escribir estos datos en matrices en un

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

loop.