Comparando arquivos e suas propriedades

2

Eu recebo informações de um determinado conjunto de arquivos no meu e-mail todos os dias, o que é assim:

58623208 Sep 14 20:08 blbn_blfbe_drv
57904920 Sep 14 19:54 blbn_cycmn
55814208 Sep 14 06:02 clsa_Upd
38912000 Sep 14 19:12 cs_chgpp
41107456 Sep 14 19:17 csmRFbe
39403520 Sep 14 19:09 csmUAddAct
39235584 Sep 14 19:20 csmUAddSub

... e assim por diante, por cerca de 60 arquivos.

Agora, preciso comparar todos esses arquivos, um por um, com os arquivos existentes para garantir que todos os arquivos sejam encontrados correspondentes.

filename , timestamp , date e size são as coisas que devem ser correspondentes.

Existe alguma maneira de automatizá-lo?

Eu estava pensando em usar comm ou diff .

    
por munish 15.09.2011 / 04:31

2 respostas

2

Suponho que você tenha a data do GNU, com a opção -d :

while read size mon day time filename; do
    if [[ ! -f "$filename" ]]; then
        echo "ERROR: no such file: $filename" >&2
    else
        filesize=$(stat -c %s "$filename")
        if [[ "$size" != "$filesize" ]]; then
            echo "ERROR: size mismatch: $filename" >&2
        else
            filetime=$(date -d "$(stat -c %y "$filename")" "+%b %d %H:%M")
            if [[ "$mon $day $time" != "$filetime" ]]; then
                echo "ERROR: date mismatch: $filename" >&2
            fi
        fi
    fi
done 
    
por 15.09.2011 / 18:11
1

Assumindo que todos os novos arquivos estão em (ou podem ser movidos para) novos / e todos os arquivos antigos estão em antigos / diretórios, você pode usar 'diff -ur old / new /' para ver as diferenças nos arquivos entre os diretórios .

Se você não se importa com a natureza das diferenças, apenas o fato de que alguns arquivos são diferentes, use grep para filtrar a saída - mas você perderá o código de saída do diff (1 = diferenças encontradas). Em vez disso, você pode usar o código de saída do grep (1 = nenhuma correspondência de expressão regular encontrada, o que você pode interpretar para significar que todos os arquivos são iguais).

por exemplo. Eu gerava alguns arquivos de texto no antigo e no novo (apenas lixo contendo listas de diretórios / bin, / sbin e / etc). então eu editei o novo / baz e deletei algumas linhas:

$ ls -l new old
new:
total 28
-rw-r--r-- 1 cas cas 11063 Sep 15 15:27 baz
-rw-r--r-- 1 cas cas 14529 Sep 15 15:25 foo

old:
total 20
-rw-r--r-- 1 cas cas  6843 Sep 15 15:24 bar
-rw-r--r-- 1 cas cas 12025 Sep 15 15:24 baz

primeiro, compare os dois diretórios:

$ diff -ur old new | egrep '^(Only|diff)'
Only in old: bar
diff -ur old/baz new/baz
Only in new: foo
$ echo $?
0

aqui você pode ver o código de saída quando os diretórios src e dst são os mesmos (ou têm exatamente o mesmo conteúdo)

$ diff -ur old old | egrep '^(Only|diff)'
$ echo $?
1

você também pode usar o cmp, mas ele só pode corresponder a arquivos individuais, ele não pode verificar recursivamente dois diretórios em busca de diferenças. você teria que escrever um wrapper for loop em torno dele, e você teria que levar em conta arquivos que existem apenas em novos, mas não em antigos. mais fácil de usar diff.

    
por 15.09.2011 / 07:43