diff - directorio - tar gz ubuntu
Cómo comparar el contenido de un archivo tar con una carpeta (4)
¿Cómo puedo comparar un archivo tar
(ya comprimido) de la carpeta original con la carpeta original?
Primero creé el archivo comprimido usando
tar -kzcvf directory_name.zip directory_name
Entonces traté de comparar usando
tar -diff -vf directory_name.zip directory_name
Pero no funcionó.
Debería ser --diff
Prueba esto (sin el último nombre de directorio):
tar --diff -vf directory_name.zip
El problema es que el comando --diff solo busca diferencias en los archivos existentes entre el archivo tar y la carpeta. Por lo tanto, si se agrega un nuevo archivo a la carpeta, el comando diff no informa esto.
El método de pix es muy lento para los archivos comprimidos de gran tamaño, ya que extrae cada archivo individualmente. Utilizo el método tar --diff buscando archivos con diferentes tiempos de modificación y extraigo y difiero 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 resulta en diferencias incluyendo la fecha del archivo original.
Aquí está el guión:
#!/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
Hace poco necesitaba una comparación mejor que la que produjo "tar --diff", así que hice este breve script:
#!/bin/bash
tar tf "$1" | while read ; do
if [ "${REPLY%/}" = "$REPLY" ] ; then
tar xOf "$1" "$REPLY" | diff -u - "$REPLY"
fi
done
--compare (-d)
es más útil para eso.
tar --compare --file=archive-file.tar
funciona si archive-archivo.tar está en el directorio en el que se creó. Para comparar archive-file.tar contra un objetivo remoto (por ejemplo, si ha movido archive-file.tar a / some / where /) use el parámetro -C
:
tar --compare --file=archive-file.tar -C /some/where/
Si desea ver el funcionamiento de tar, use -v
sin -v
solo se informan los errores (archivos / carpetas que faltan).
Sugerencia: esto también funciona con archivos comprimidos tar.bz/tar.gz.