2012-02-08 151 views
16

如何將原始文件夾的tar文件(已壓縮)與原始文件夾進行比較?將目錄的tar文件與原始目錄進行比較

首先,我創建了使用

tar -kzcvf directory_name.zip directory_name 

然後我試圖使用

tar -diff -vf directory_name.zip directory_name 

比較存檔文件,但沒有奏效。

+1

史蒂夫你好,請註明用綠色箭頭一個答案,如果你認爲這是回答你的問題。 – zzeroo 2016-10-26 08:53:56

回答

2

應該--diff

試試這個(沒有最後的目錄名):

tar --diff -vf directory_name.zip 

的問題是,--diff命令只查找焦油中的現有文件的差異文件和文件夾。所以,如果新文件被添加到文件夾中,那麼diff命令不會報告這個。

+0

此命令是否報告文件元數據中的差異,即所有權,權限,符號鏈接目標,設備節點屬性等?我正在計劃一個Linux根文件系統的備份,並且我想確保所有這些元數據都是正確的。 – enigmaticPhysicist 2015-08-10 14:13:43

21

--compare (-d)更方便。

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

如果archive-file.tar位於創建的目錄中,則可以正常工作。要對遠程目標比較歸檔文件.tar(例如,如果您移動歸檔文件.tar到/一些/地方/)使用-C參數:

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

如果你想看到焦油工作,使用-v沒有-v只報告錯誤(丟失文件/文件夾)。

提示:這也適用於壓縮的tar.bz/tar.gz檔案。

+0

這是答案,它回答了一個更一般和重要的問題: 「如何比較tarball和文件夾的內容」,這是更一般的,幷包括這個問題。所以我認爲這個問題應該改寫,這個答案順便接受 – 2017-12-12 09:51:55

+0

,你知道如何擺脫GID和UID的比較嗎? – 2017-12-12 09:58:36

1

最近,我需要一個更好的比生產等什麼「焦油--diff」我做了這個簡短的腳本比較:

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

什麼是'$ REPLY'? – Brian 2015-04-07 17:39:32

+0

@staticx $ REPLY由'read'命令創建(在'while'測試中)。它包含整行,因此在這種情況下它是來自'tar t'命令的當前文件名。 – pix 2015-04-08 22:10:49

2

PIX的方法是緩慢的方式大型壓縮tar文件,因爲它提取每文件單獨。我使用tar --diff方法來調用具有不同修改時間的文件,並僅提取和區分這些文件。這些文件被提取到一個文件夾base.orig中,其中base是tar文件的頂層文件夾或給定的比較文件夾。這會導致差異包括原始文件的日期。

下面是腳本:

#!/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 
相關問題