Как сравнить содержимое тарбола с папкой - PullRequest
19 голосов
/ 08 февраля 2012

Как сравнить файл tar (уже сжатый) исходной папки с исходной папкой?

Сначала я создал архивный файл, используя

tar -kzcvf directory_name.zip directory_name

Затем я попытался сравнить, используя

tar -diff -vf directory_name.zip directory_name

Но это не сработало.

Ответы [ 4 ]

31 голосов
/ 31 января 2014

--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.

3 голосов
/ 07 октября 2016

Метод 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
3 голосов
/ 14 февраля 2013

Должно быть --diff

Попробуйте это (без последнего имени_каталога):

tar --diff -vf directory_name.zip

Проблема в том, что команда --diff ищет только различия в существующих файлах между файлом tar и папкой. Таким образом, если в папку добавляется новый файл, команда diff не сообщает об этом.

1 голос
/ 11 сентября 2014

Мне недавно нужно было сравнить лучше, чем то, что произвел tar --diff, поэтому я сделал этот короткий скрипт:

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