2012-02-08 14 views
16

Come è possibile confrontare un file tar (già compresso) della cartella originale con la cartella originale?Confronta il file tar della directory con la directory originale

Per prima cosa ho creato file di archivio usando

tar -kzcvf directory_name.zip directory_name 

Poi ho provato a confrontare con

tar -diff -vf directory_name.zip directory_name 

Ma non ha funzionato.

+1

Hi steve, si prega di contrassegnare una risposta con la freccia verde se si pensa che è rispondere alla tua domanda. – zzeroo

risposta

2

Dovrebbe essere --diff

Prova questa (senza l'ultima directory_name):

tar --diff -vf directory_name.zip 

Il problema è che il comando --diff cerca solo differenze sui file esistenti tra il catrame file e la cartella. Quindi, se un nuovo file viene aggiunto alla cartella, il comando diff non lo segnala.

+0

Questo comando riporta differenze nei metadati del file, ovvero proprietà, autorizzazioni, destinazioni dei link simbolici, proprietà del nodo del dispositivo, ecc.? Sto pianificando un backup di un filesystem di root di Linux, e voglio assicurarmi che tutti questi metadati siano corretti. – enigmaticPhysicist

21

--compare (-d) è più utile per questo.

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

funziona se archive-file.tar si trova nella directory in cui è stato creato. Per confrontare archivio a file.tar contro un bersaglio a distanza (ad esempio, se si è spostato archivio-file.tar a/some/dove /) utilizzare il parametro -C:

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

Se volete vedere il catrame di lavoro, l'uso -v senza -v vengono segnalati solo errori (file/cartelle mancanti).

Tipp: Funziona anche con gli archivi compressi tar.bz/ tar.gz.

+0

questa è la risposta, e risponde a una domanda più generale e importante: "Come confrontare il contenuto di un tarball con una cartella", che è più generale e includere questa domanda. Quindi penso che la domanda dovrebbe essere riformulata e questa risposta ha accettato –

+0

tra l'altro, sai come sbarazzarti del confronto tra GID e UID? –

1

Recentemente ho bisogno di un miglior confronto di quello che "tar --diff" prodotto così ho fatto questo breve script:

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

cosa c'è "$ RISPOSTA"? – Brian

+0

@staticx $ REPLY viene creato dal comando 'read' (nel test' while'). Contiene la linea completa, quindi in questo caso è il nome file corrente dal comando 'tar t'. – pix

2

Il metodo di Pix è il modo lento per grandi file tar compressi, perché estrae ogni file individualmente. Io uso il metodo tar --diff loking per i file con tempi di modifica diversi ed estrae e diff solo questi. I file vengono estratti in una cartella base.orig dove base è la cartella di livello superiore del file tar o la cartella di confronto fornita. Ciò comporta differenze tra cui la data del file originale.

Ecco lo script:

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