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.md5sum -- "$file"
lugar demd5sum "$file"
manejar el caso donde un archivo comienza con a-
. Por supuesto, también debe hacer que su implementación de md5sum admita el--
final del delimitador de opciones.Puede usar inotify-tools definitivamente desde la línea de comandos, por ejemplo, así:
Del hombre inotifywait
Y aquí hay un script que monitorea continuamente, copiado del archivo man de
inotifywait
:fuente
Puede usar el
inotify-tools
paquete para monitorear todos los cambios en una carpeta en tiempo real. Por ejemplo, contiene lainotifywait
herramienta, que puede usar como:Puede usar banderas para filtrar ciertos eventos solamente o ciertos archivos. La
inotifywatch
herramienta recopila estadísticas de uso del sistema de archivos y genera recuentos de cadainotify
evento.Puede encontrar más ejemplos aquí, por ejemplo.
Si desea monitorear con otras herramientas, puede usar
find
con el-mmin
parámetro (minutos modificados). Dado que 2 segundos son como 0.033 minutos, puede usar:fuente
Si desea monitorear en un intervalo de dos segundos, puede rodear su cheque con:
Si bien esto probará secuencialmente los archivos y esperará 2 segundos por cada archivo encontrado, sugiero transformar su verificación en una función:
Que se puede usar en el
while
bucle:Tenga en cuenta el
&
ampersand para realizar las comprobaciones en segundo plano para realizar las comprobaciones de archivos en paralelo. Tenga en cuenta que esto puede afectar el rendimiento según la cantidad de archivos encontrados en el directorio.También tenga en cuenta que cambié las
echo
líneas para incluir el nombre de archivo ("$@"
) para visualizar qué archivo se encuentra idéntico / diferente.fuente
fuente