2012-02-08 44 views
16

Làm cách nào để so sánh tệp tar (đã được nén) của thư mục gốc với thư mục gốc?So sánh tập tin tar của thư mục với thư mục gốc

Trước tiên tôi tạo ra tập tin lưu trữ sử dụng

tar -kzcvf directory_name.zip directory_name 

Sau đó, tôi đã cố gắng để so sánh sử dụng

tar -diff -vf directory_name.zip directory_name 

Nhưng nó đã không làm việc.

+1

Hi steve, xin vui lòng đánh dấu một câu trả lời với mũi tên màu xanh lá cây nếu bạn nghĩ đó là trả lời câu hỏi của bạn. – zzeroo

Trả lời

2

Nó phải là --diff

Hãy thử điều này (không có directory_name cuối cùng):

tar --diff -vf directory_name.zip 

Vấn đề là lệnh --diff chỉ tìm kiếm sự khác biệt về các tập tin hiện có giữa các tar và thư mục. Vì vậy, nếu một tập tin mới được thêm vào thư mục, lệnh diff không báo cáo điều này.

+0

Lệnh này có báo cáo sự khác biệt về siêu dữ liệu tệp, nghĩa là quyền sở hữu, quyền, mục tiêu liên kết tượng trưng, ​​thuộc tính nút thiết bị, v.v. không? Tôi đang lập kế hoạch sao lưu của một hệ thống tập tin gốc Linux, và tôi muốn chắc chắn rằng tất cả các siêu dữ liệu này là chính xác. – enigmaticPhysicist

21

--compare (-d) thuận tiện hơn cho điều đó.

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

hoạt động nếu tệp lưu trữ.tar nằm trong thư mục được tạo. Để so sánh archive-file.tar chống lại một mục tiêu từ xa (ví dụ như nếu bạn đã chuyển lưu trữ-file.tar đến/một số/nơi /) sử dụng -C tham số:

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

Nếu bạn muốn xem tar làm việc, sử dụng -v mà không có -v chỉ có lỗi (thiếu tệp/thư mục) được báo cáo.

Trích dẫn: Điều này cũng hoạt động với lưu trữ tar.bz/ tar.gz được nén.

+0

đây là câu trả lời và câu trả lời là câu hỏi tổng quát và quan trọng hơn: "Cách so sánh nội dung của tarball với thư mục", tổng quát hơn và bao gồm câu hỏi này. Vì vậy, tôi nghĩ rằng câu hỏi nên được rephrased và câu trả lời này chấp nhận –

+0

bằng cách này, bạn có biết làm thế nào để thoát khỏi sự so sánh GID và UID? –

1

Gần đây tôi cần một người tốt hơn so sánh với những gì "tar --diff" sản xuất vì vậy tôi làm kịch bản ngắn này:

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

'$ REPLY' là gì? – Brian

+0

@staticx $ REPLY được tạo bởi lệnh 'read' (trong thử nghiệm' while'). Nó chứa dòng đầy đủ, vì vậy trong trường hợp này, nó là tên tệp hiện tại từ lệnh 'tar t'. – pix

2

Phương pháp pix là cách chậm cho các tập tin tar nén lớn, bởi vì nó chiết xuất mỗi tệp riêng lẻ. Tôi sử dụng phương thức tar --diff cho các tệp có thời gian sửa đổi và trích xuất khác nhau và chỉ phân biệt chúng. Các tập tin được trích xuất vào một thư mục base.orig nơi cơ sở hoặc là thư mục cấp cao nhất của tập tin tar hoặc teh cho thư mục so sánh. Điều này dẫn đến sự khác biệt bao gồm cả ngày của tập tin gốc.

Đây là kịch bả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 
Các vấn đề liên quan