Como otros han explicado, usar inotify
es la mejor solución. Solo explicaré por qué falla su script. En primer lugar, no importa en qué lenguaje esté programando, cada vez que intente depurar algo, la primera regla es "imprimir todas las variables":
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
Entonces, como puede ver arriba, en $FILE
realidad se expande a $PWD/*
. Por lo tanto, el bucle solo se ejecuta una vez en la cadena /home/terdon/foo/*
y no en cada uno de los archivos del directorio individualmente. Entonces, el md5sum
comando se convierte en:
md5sum /home/terdon/foo/*
En otras palabras, se ejecuta md5sum
en todos los archivos en el directorio de destino a la vez y no en cada uno de ellos.
El problema es que estás citando la expansión global y eso impide que se expanda:
$ echo "*"
*
$ echo *
file1 file2 file3
Si bien las variables casi siempre deberían citarse , los globos no deberían hacerlo, ya que eso los convierte en cadenas en lugar de globos.
Lo que querías hacer es:
for FILE in "${PWD}"/*; do ...
Sin embargo, no hay ninguna razón para usar $PWD
aquí, no está agregando nada útil. La línea de arriba es equivalente a:
for FILE in *; do
Además, evite usar letras MAYÚSCULAS para las variables de shell. Esos se usan para las variables ambientales establecidas por el sistema y es mejor mantener sus propias variables en minúsculas.
Con todo esto en mente, aquí hay una versión mejorada y funcional de su script:
#!/bin/bash
for file in *
do
sum1="$(md5sum "$file")"
sleep 2
sum2="$(md5sum "$file")"
if [ "$sum1" = "$sum2" ];
then
echo "Identical"
else
echo "Different"
fi
done
for FILE in "${PWD}"/*; do
funciona en el mismo conjunto, yafor FILE in *; do
que no es exactamente equivalente porque este último no incluye los nombres de ruta.