【问题标题】:How to compare the content of a tarball with a folder如何将 tarball 的内容与文件夹进行比较
【发布时间】:2012-02-08 03:34:10
【问题描述】:

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

首先我使用

创建存档文件
tar -kzcvf directory_name.zip directory_name

然后我尝试使用比较

tar -diff -vf directory_name.zip directory_name

但是没有用。

【问题讨论】:

    标签: diff compare tar


    【解决方案1】:

    --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,只会报告错误(缺少文件/文件夹)。

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

    【讨论】:

    • 这就是答案,它回答了一个更普遍和更重要的问题:“如何比较 tarball 的内容与文件夹”,它更普遍,包括这个问题。所以我认为应该改写这个问题并接受这个答案
    • 对了,你知道如何摆脱 GID 和 UID 的比较吗?
    • 无论我尝试哪种方式都会收到“警告:无法统计:没有这样的文件或目录”。
    【解决方案2】:

    应该是--diff

    试试这个(没有最后一个目录名):

    tar --diff -vf directory_name.zip
    

    问题在于 --diff 命令只查找 tar 文件和文件夹之间现有文件的差异。因此,如果将新文件添加到文件夹中,diff 命令不会报告这一点。

    【讨论】:

    • 此命令是否报告文件元数据的差异,即所有权、权限、符号链接目标、设备节点属性等?我正在计划一个 linux 根文件系统的备份,我想确保所有这些元数据都是正确的。
    【解决方案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
    

    【讨论】:

      【解决方案4】:

      我最近需要一个比“tar --diff”产生的更好的比较,所以我制作了这个简短的脚本:

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

      【讨论】:

      • @staticx $REPLY 由read 命令创建(在while 测试中)。它包含整行,因此在这种情况下,它是来自tar t 命令的当前文件名。
      【解决方案5】:

      要忽略部分或全部元数据(用户、时间、权限)的差异,您可以将结果通过管道传输到awk

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

      这应该只输出 tar 和目录 /some/where/ 之间的真正区别

      【讨论】:

        【解决方案6】:

        简单的方法是写:

        • tar df file 这会将 文件 与当前工作目录进行比较,并告诉我们是否有任何文件已被删除。
        • tar df file -C path/folder 这会将文件与文件夹进行比较。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多