¿Cómo puedo verificar si un directory contiene los mismos files de un file TAR?

Digamos que tengo una carpeta Documents y un file TAR Documents.tar , ¿cómo puedo verificar si el file tar contiene los mismos files que están presentes en el directory?

La solución más obvia para mí sería hacer:

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

Desafortunadamente, esto es muy lento para grandes files TAR, ¿hay alguna otra alternativa?

Usar tar -dvf Documents.tar (o –diff, –compare) no funciona porque no detecta un file que está presente en el sistema de files pero no en el file TAR, simplemente detecta un file presente en el Archivo TAR pero no en el sistema de files, por ejemplo:

 $ 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 

Salida

 new/ new/foo2 new/foo3 new/foo4 new/foo1 tar: new/foo1: Warning: Cannot stat: No such file or directory ### works ### 

Si solo desea comparar lists de nombres de files y directorys, la opción -d no es útil. En cambio, la diferenciación de las lists clasificadas de find y tar -tf haría eso .

Comenzando con los nombres asumidos en el ejemplo original de OP:

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

aquí hay una secuencia de commands sugerida para diferenciar los nombres de file:

 #!/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 

Esto supone que Documents.tar contiene el mismo directory de "Documentos" de nivel superior. Si esa no es una buena suposition, entonces las lists deben filtrarse para eliminar el nombre del directory de nivel superior. OP no indicó que esto sería un problema, sin embargo.

En cualquier caso, las lists deben estar orderadas, porque no hay garantía de qué order usar los progtwigs tar y find .

mktemp debido a la pista de que OP está utilizando GNU tar (la opción -d ), lo que lo hace probable en Linux.

Por supuesto, no hay una reference POSIX para reference con respecto a -d . pax no hace diff tampoco.

Con un file tar estándar, esto no es posible. Esto se debe a que un file tar estándar no incluye la list de contenido del directory.

Con las mejoras de star que están presentes cuando se le dice a star que archive todo lo que se necesita para las copys de security incrementales, funciona:

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

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

Puede networkingucir la cantidad de metadatos que se compara utilizando la opción diffopts= , consulte la página man.