2012-02-08 16 views
16

Jak mogę porównać plik (już skompresowany) z oryginalnego folderu z oryginalnym folderem?Porównaj plik tar katalogu z oryginalnym katalogiem

Najpierw stworzyłem plik archiwum używając

tar -kzcvf directory_name.zip directory_name 

Potem starałem się porównać z użyciem

tar -diff -vf directory_name.zip directory_name 

Ale to nie działa.

+1

Cześć Steve, proszę zaznaczyć odpowiedź z zieloną strzałką, jeśli uważasz, że jest to odpowiedź na Twoje pytanie. – zzeroo

Odpowiedz

2

Należy --diff

Spróbuj tego (bez ostatniej nazwa_katalogu):

tar --diff -vf directory_name.zip 

Problem polega na tym, że polecenie --diff wygląda tylko na różnice w istniejących plików między smoły plik i folder. Tak więc, jeśli nowy plik zostanie dodany do folderu, polecenie diff tego nie zgłosi.

+0

Czy ten raport polecenia zawiera różnice w metadanych pliku, tj. Prawa własności, uprawnienia, cele symlink, właściwości węzła urządzenia itp.? Planuję kopię zapasową systemu plików root'a i chcę się upewnić, że wszystkie te metadane są poprawne. – enigmaticPhysicist

21

--compare (-d) jest bardziej przydatny do tego.

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

działa, jeśli plik archive-file.tar znajduje się w katalogu, w którym został utworzony. Aby porównać Archiwum-file.tar na zdalnym docelowej (np jeśli zostały przeniesione do archiwum-file.tar/some/gdzie /) użyj parametru -C:

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

Jeśli chcesz zobaczyć smoła działa, użyj -v bez -v zgłaszane są tylko błędy (brakujące pliki/foldery).

Tipp: Działa również ze skompresowanymi archiwami tar.bz/ tar.gz.

+0

jest to odpowiedź, która odpowiada na bardziej ogólne i ważne pytanie: "Jak porównać zawartość tarballa z folderem", która jest bardziej ogólna i zawiera to pytanie. Tak więc myślę, że pytanie powinno zostać ponownie sformułowane, a ta odpowiedź przyjął –

+0

przy okazji, czy wiesz, jak pozbyć się porównania GID i UID? –

1

Niedawno potrzebne lepsze porównanie niż co „tar --diff” wyprodukowany więc zrobiłem ten krótki skrypt:

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

co to jest "$ REPLY"? – Brian

+0

@staticx $ ODPOWIEDŹ jest tworzone przez polecenie 'read' (w teście' while'). Zawiera pełną linię, więc w tym przypadku jest to aktualna nazwa pliku z polecenia 'tar t'. – pix

2

Sposób pix jest sposób powolny dla dużych skompresowanych plików typu tar, ponieważ wydobywa każdy pojedynczo. Używam metody tar --diff loking dla plików o różnym czasie modyfikacji i wyodrębnianie i porównywanie tylko tych. Pliki są wyodrębniane do folderu baza.orig gdzie baza jest albo folderem najwyższego poziomu pliku tar lub danego folderu porównania. Powoduje to różnice, w tym datę oryginalnego pliku.

Oto scenariusz:

#!/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 
Powiązane problemy