Como posso verificar se um diretório contém os mesmos arquivos de um arquivo TAR?

2

Digamos que eu tenha uma pasta Documents e um arquivo TAR Documents.tar , como verificar se o arquivo tar contém os mesmos arquivos que estão presentes no diretório?

A solução mais óbvia para mim seria:

$ tar xvf Documents.tar -C untarDocs
$ diff -r Documents untarDocs

Infelizmente isso é muito lento para grandes arquivos TAR, existe alguma outra alternativa?

Usar tar -dvf Documents.tar (ou --diff, --compare) não funciona porque não detecta um arquivo que está presente no sistema de arquivos, mas não no arquivo TAR, apenas detecta um arquivo presente no arquivo. Arquivo TAR, mas não no sistema de arquivos, por exemplo:

$ mkdir new
$ touch new/foo{1..4}
$ tar cvf new.tar new/
$ touch new/bar
$ tar --diff --verbose --file=new.tar       #### doesn't detect new/bar #########
$ rm new/foo1
$ tar --diff --verbose --file=new.tar

Saída

new/
new/foo2
new/foo3
new/foo4
new/foo1
tar: new/foo1: Warning: Cannot stat: No such file or directory   ### works ###
    
por marcanuy 15.11.2015 / 21:20

2 respostas

2

Se você quiser comparar apenas as listas de nomes de arquivos e diretórios, a opção -d não é útil. Em vez disso, as listas ordenadas do diff de find e tar -tf fariam isso .

Começando com os nomes assumidos no exemplo original do OP:

$ tar xvf Documents.tar -C untarDocs
$ diff -r Documents untarDocs

aqui está um script sugerido para diferenciar os nomes dos arquivos:

#!/bin/sh
MYDIR=$(mktemp -d)
tar tf Documents.tar |sort >$MYDIR/from-tar
find Documents |sort >$MYDIR/from-dir
(cd $MYDIR && diff -r from-tar from-dir)
rm -rf $MYDIR

Isso pressupõe que Documents.tar contenha o mesmo diretório "Documentos" de nível superior. Se isso não for uma boa suposição, as listas devem ser filtradas para remover o nome do diretório de nível superior. OP não indicou que isso seria um problema, no entanto.

Em qualquer caso, as listas devem ser classificadas, porque não há garantia de qual ordem os programas tar e find usam.

Eu usei mktemp por causa do indício de que o OP está usando o GNU tar (o -d opção ), o que torna provável no Linux.

É claro que não há tar POSIX para referência em relação a -d . pax também não faz diferença.

    
por 15.11.2015 / 21:41
-1

Com um arquivo TAR padrão, isso não é possível. Isso ocorre porque um arquivo tar padrão não inclui a lista de conteúdo do diretório.

Com as exibições star presentes quando a estrela é instruída a arquivar tudo o que é necessário para backups incrementais, ele funciona:

1) star -c -dump -C somedir . > /tmp/tarfile

2) star -diff -vv -C comparedir < /tmp/tarfile

Você pode reduzir a quantidade de metadados que são comparados usando a opção diffopts= , consulte a página man.

    
por 16.11.2015 / 00:30