如何比较tarball的内容与文件夹

时间:2012-02-08 03:34:10

标签: diff compare tar

如何将原始文件夹的tar文件(已压缩)与原始文件夹进行比较?

首先我使用

创建了档案文件
tar -kzcvf directory_name.zip directory_name

然后我尝试使用

进行比较
tar -diff -vf directory_name.zip directory_name

但它不起作用。

5 个答案:

答案 0 :(得分:30)

--compare (-d)对此更为方便。

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

如果archive-file.tar位于创建目录中,则有效。要将archive-file.tar与远程目标进行比较(例如,如果已将archive-file.tar移动到/ some / where /),请使用-C参数:

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

如果您希望查看tar工作,请使用-v而不-v仅报告错误(丢失的文件/文件夹)。

Tipp:这也适用于压缩的tar.bz/ tar.gz档案。

答案 1 :(得分:3)

应该是--diff

试试这个(没有最后一个directory_name):

tar --diff -vf directory_name.zip

问题是--diff命令只查找tar文件和文件夹中现有文件的差异。因此,如果将新文件添加到文件夹,则diff命令不会报告此情况。

答案 2 :(得分:3)

对于大型压缩tar文件,pix的方法速度慢,因为它会单独提取每个文件。我使用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

答案 3 :(得分:1)

我最近需要比什么&#34; tar --diff&#34;更好的比较。因此我制作了这个简短的剧本:

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

答案 4 :(得分:0)

我已经添加到@zzeroo答案中,因为我发现时间和用户以及文件权限都已更改。

tar --compare --file=archive-file.tar -C /some/where/ | awk '!'Mode/ && !/Uid/ && !/Gid/ && !/time/'

那应该只输出tar和目录/ some / where /

之间的真实差异