Como outros explicaram, usar inotify
é a melhor solução. Vou apenas explicar por que seu script falha. Primeiro de tudo, não importa em qual idioma você está programando, sempre que você tentar depurar algo, a primeira regra é "imprimir todas as variáveis":
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
Então, como você pode ver acima, $FILE
é realmente expandido para $PWD/*
. Portanto, o loop é executado apenas uma vez na cadeia /home/terdon/foo/*
e não em cada um dos arquivos no diretório individualmente. Então, o md5sum
comando se torna:
md5sum /home/terdon/foo/*
Em outras palavras, ele é executado md5sum
em todos os arquivos no diretório de destino de uma só vez e não em cada um deles.
O problema é que você está citando sua expansão glob e impede que ela seja expandida:
$ echo "*"
*
$ echo *
file1 file2 file3
Enquanto as variáveis quase sempre devem ser citadas , os globs não devem, pois isso os transforma em strings em vez de globs.
O que você pretendia fazer é:
for FILE in "${PWD}"/*; do ...
No entanto, não há razão para usar $PWD
aqui, não está adicionando nada de útil. A linha acima é equivalente a:
for FILE in *; do
Além disso, evite usar letras maiúsculas para variáveis de shell. Elas são usadas para as variáveis ambientais definidas pelo sistema e é melhor manter suas próprias variáveis em minúsculas.
Com tudo isso em mente, aqui está uma versão melhorada e funcional do seu 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
trabalha no mesmo conjunto,for FILE in *; do
não é exatamente equivalente, porque o último não inclui os nomes de caminho.md5sum -- "$file"
vez demd5sum "$file"
lidar com o caso em que um arquivo começa com a-
. Obviamente, você também deve fazer sua implementação do md5sum suportar o--
delimitador de final de opções.Você pode usar as ferramentas inotify definitivamente na linha de comando, por exemplo:
De man inotifywait
E aqui está um script que monitora continuamente, copiado do arquivo man de
inotifywait
:fonte
Você pode usar o
inotify-tools
pacote para monitorar todas as alterações em uma pasta em tempo real. Por exemplo, ele contém ainotifywait
ferramenta, que você pode usar como:Você pode usar sinalizadores para filtrar apenas determinados eventos ou determinados arquivos. A
inotifywatch
ferramenta coleta estatísticas de uso do sistema de arquivos e gera contagens de cadainotify
evento.Você pode encontrar mais exemplos aqui, por exemplo.
Se você deseja monitorar com outras ferramentas, pode usar
find
com o-mmin
parâmetro (minutos modificados). Como 2 segundos é de 0,033 minutos, você pode usar:fonte
Se você deseja monitorar em um intervalo de dois segundos, pode cercar seu cheque com:
Enquanto isso testará seqüencialmente os arquivos e aguardará 2 segundos para cada arquivo encontrado, sugiro que você transforme sua verificação em uma função:
Que pode ser usado no
while
loop:Observe
&
oe comercial para executar as verificações em segundo plano para executar as verificações de arquivo em paralelo. Observe que isso pode afetar o desempenho, dependendo do número de arquivos encontrados no diretório.Observe também que alterei as
echo
linhas para incluir o nome do arquivo ("$@"
) para visualizar qual arquivo é encontrado idêntico / diferente.fonte
fonte