2012-02-08 64 views
16

¿Cómo puedo comparar un archivo tar (ya comprimido) de la carpeta original con la carpeta original?Comparar el archivo tar del directorio con el directorio original

Primero creé archivo de almacenamiento utilizando

tar -kzcvf directory_name.zip directory_name 

Luego trató de comparar el uso de

tar -diff -vf directory_name.zip directory_name 

Pero no funcionó.

+1

Hola Steve, por favor marque una respuesta con la flecha verde si usted piensa que es responder a su pregunta. – zzeroo

Respuesta

2

Debe ser --diff

probar este (sin la última directory_name):

tar --diff -vf directory_name.zip 

El problema es que el comando --diff sólo se ve por las diferencias en los archivos existentes entre el alquitrán archivo y la carpeta. Entonces, si se agrega un nuevo archivo a la carpeta, el comando diff no informa esto.

+0

¿Este comando informa las diferencias en metadatos de archivos, es decir, propiedad, permisos, objetivos de enlace simbólico, propiedades de nodo de dispositivo, etc.? Estoy planeando una copia de seguridad de un sistema de archivos raíz de Linux, y quiero asegurarme de que todos estos metadatos sean correctos. – enigmaticPhysicist

21

--compare (-d) es más útil para eso.

tar --compare --file=archive-file.tar 

funciona si archive-file.tar está en el directorio en el que se creó. Para comparar archivo-fichero.tar contra un objetivo remoto (por ejemplo, si se ha mudado archivo-fichero.tar a/some/where /) utiliza el parámetro -C:

tar --compare --file=archive-file.tar -C /some/where/ 

Si desea ver el alquitrán de trabajo, el uso -v sin -v solo se informaron los errores (archivos/carpetas faltantes).

Sugerencia: Esto también funciona con los archivos comprimidos tar.bz/ tar.gz.

+0

esta es la respuesta, y responde a una pregunta más general e importante: "Cómo comparar el contenido de un tarball con una carpeta", que es más general e incluye esta pregunta. Por lo tanto, creo que la pregunta debe reformularse y esta respuesta se aceptó –

+0

por cierto, ¿sabe cómo deshacerse de la comparación de GID y UID? –

1

recientemente que necesitaba una mejor comparar a lo que "alquitrán --diff" producido así que hice esta corta secuencia de comandos:

#!/bin/bash 
tar tf "$1" | while read ; do 
    if [ "${REPLY%/}" = "$REPLY" ] ; then 
    tar xOf "$1" "$REPLY" | diff -u - "$REPLY" 
    fi 
done 
+0

¿Qué es '$ RESPUESTA? – Brian

+0

@staticx $ REPLY es creado por el comando 'read' (en la prueba' while'). Contiene la línea completa, por lo que en este caso es el nombre de archivo actual del comando 'tar t'. – pix

2

El método de pix es lento camino para grandes archivos tar comprimidos, ya que extrae cada archivo individualmente Utilizo el método tar -diff para buscar archivos con diferente tiempo de modificación y extraer y diferenciar solo estos. Los archivos se extraen en una carpeta base.orig donde base es la carpeta de nivel superior del archivo tar o la carpeta de comparación dada. Esto da como resultado diffs incluyendo la fecha del archivo original.

Aquí está la secuencia de comandos:

#!/bin/bash 
set -o nounset 

# Print usage 

if [ "$#" -lt 1 ] ; then 
    echo 'Diff a tar (or compressed tar) file with a folder' 
    echo 'difftar-folder.sh <tarfile> [<folder>] [strip]' 
    echo default for folder is . 
    echo default for strip is 0. 
    echo 'strip must be 0 or 1.' 
    exit 1 
fi 

# Parse parameters 

tarfile=$1 

if [ "$#" -ge 2 ] ; then 
    folder=$2 
else 
    folder=. 
fi 

if [ "$#" -ge 3 ] ; then 
    strip=$3 
else 
    strip=0 
fi 

# Get path prefix if --strip is used 

if [ "$strip" -gt 0 ] ; then 
    prefix=`tar -t -f $tarfile | head -1` 
else 
    prefix= 
fi 

# Original folder 

if [ "$strip" -gt 0 ] ; then 
    orig=${prefix%/}.orig 
elif [ "$folder" = "." ] ; then 
    orig=${tarfile##*/} 
    orig=./${orig%%.tar*}.orig 
elif [ "$folder" = "" ] ; then 
    orig=${tarfile##*/} 
    orig=${orig%%.tar*}.orig 
else 
    orig=$folder.orig 
fi 
echo $orig 
mkdir -p "$orig" 


# Make sure tar uses english output (for Mod time differs) 
export LC_ALL=C 

# Search all files with a deviating modification time using tar --diff 
tar --diff -a -f "$tarfile" --strip $strip --directory "$folder" | grep "Mod time differs" | while read -r file ; do 
    # Substitute ': Mod time differs' with nothing 
    file=${file/: Mod time differs/} 
    # Check if file exists 
    if [ -f "$folder/$file" ] ; then 
    # Extract original file 
    tar -x -a -f "$tarfile" --strip $strip --directory "$orig" "$prefix$file" 
    # Compute diff 
    diff -u "$orig/$file" "$folder/$file" 
    fi 
done 
Cuestiones relacionadas