empaquetar directorio descomprimir crear comprimir comando bz2 archivos archivo diff compare tar

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.