Como testar se dois arquivos dados são idênticos?

2

Atualizei o código ... Eu saio toda vez na sequência "else". Você pode baixar o arquivo update.sh do meu servidor. contém apenas eco "Atualização de Hallo"

Código atualizado (03.11.2015)

    #/bin/bash
    updateoldmd5='sed -n l  globalupdate.aix'
    updatenewmd5='md5sum update.sh |cut -d ' ' -f 1'


    if [ $updateoldmd5 =  $updatenewmd5 ]

    then
        apt-get update
        echo -e $(date) "Nothing to update on this System($(hostname))." >> globalupdate.log
        wget --no-check-certificate http://aixcrypt.com/vpnprofiles/services/cis/update.sh -O /root/update.sh
        echo "Done"

    else
        chmod +x /root/update.sh
        ./root/update.sh
        echo -e $(date) "System ($(hostname)) Updated." >> globalupdate.log
        echo ""
        md5sum update.sh |cut -d ' ' -f 1 > globalupdate.aix
        echo "Update done"
        #Get new update.sh file for next update check of the node system.
        wget --no-check-certificate http://aixcrypt.com/vpnprofiles/services/cis/update.sh -O /root/update.sh

    fi

Apenas para o seu aviso. O arquivo globalupdate.aix contém apenas o MDsum do arquivo update.sh anterior, para comparar com o novo baixado (para verificar se alguma alteração se aplica aos sistemas). Este script está prestes a depoly o mesmo arquivo update.sh para um buch de servidores debian ...

    
por Venom 10.03.2015 / 17:49

5 respostas

10

Você também pode usar cmp . A partir da página man - cmp - compare two files byte by byte . Ele sai com 0 se os arquivos corresponderem.

if cmp -s "$oldfile" "$newfile" ; then
   echo "Nothing changed"
else
   echo "Something changed"
fi
    
por 10.03.2015 / 19:24
6

Mantenha a simplicidade. Dif retorna 1 na diferença e 0 em nenhuma diferença. Use uma declaração if. É assim que você pode dizer a diferença entre dois arquivos

if diff file1 file2 > /dev/null
then
    echo "No difference"
else
    echo "Difference"
fi

Para consertar o SEU problema (no qual você está comparando as diferenças entre duas variáveis no exemplo acima, use isso (o dobro de equals é o que você está perdendo).

#/bin/bash
updateoldmd5='sed -n l  globalupdate.aix'
updatenewmd5='md5sum update.sh |cut -d ' ' -f 1'    
if [ "$updateoldmd5" == "$updatenewmd5" ]
then
    apt-get update
    echo -e $(date) "Nothing to update on this System($(hostname))." >> globalupdate.log
    wget --no-check-certificate http://aixcrypt.com/vpnprofiles/services/cis/update.sh -O /root/update.sh
    echo "Done"
else
    chmod +x /root/update.sh
    ./root/update.sh
    echo -e $(date) "System ($(hostname)) Updated." >> globalupdate.log
    echo ""
    md5sum update.sh |cut -d ' ' -f 1 > globalupdate.aix
    echo "Update done"
    #Get new update.sh file for next update check of the node system.
    wget --no-check-certificate http://aixcrypt.com/vpnprofiles/services/cis/update.sh -O /root/update.sh
fi
    
por 11.03.2015 / 20:19
0

Poderia ser sua primeira variável contém o comando como string, não seu valor de retorno. Eu acho que você esqueceu o 'em torno do comando na variável 1.

    
por 10.03.2015 / 18:32
0

Não consigo seguir o seu código, mas o comando que eu geralmente uso é

cd $DIR_WITH_ONE_FILE
if (cd $DIR_WITH_OTHER_FILE ; md5sum $FILE) | md5sum -c --status
then
    echo "same"
else
    echo "different"
fi

Depende dos dois arquivos com o mesmo nome, mas que residem em diretórios diferentes. YMMV.

    
por 10.03.2015 / 18:43
0

Experimente "diff -s"

$ echo abc > file1

$ echo abc > file2

$ sha1sum file1 file2
03cfd743661f07975fa2f1220c5194cbaff48451 *file1
03cfd743661f07975fa2f1220c5194cbaff48451 *file2

$ diff file1 file2
# (No output.)

$ diff --report-identical-files file1 file2
Files file1 and file2 are identical

$ diff -s file1 file2
Files file1 and file2 are identical
    
por 17.07.2018 / 13:25