Как сравнить содержимое тарбола с папкой - программирование
Подтвердить что ты не робот

Как сравнить содержимое тарбола с папкой

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

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

tar -kzcvf directory_name.zip directory_name

Затем я попытался сравнить с помощью

tar -diff -vf directory_name.zip directory_name

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

4b9b3361

Ответ 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 только сообщения об ошибках (отсутствующие файлы/папки).

Tipp: Это также работает со сжатыми архивами tar.bz/tar.gz.

Ответ 2

Метод pix медленный для больших сжатых файлов tar, поскольку он извлекает каждый файл по отдельности. Я использую метод tar -diff loking для файлов с различным временем модификации, а также извлекать и анализировать только эти. Файлы извлекаются в папку base.orig, где базой является либо папка верхнего уровня файла tar, либо данная папка сравнения. Это приводит к различиям, включая дату исходного файла.

Вот script:

#!/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

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

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

tar --diff -vf directory_name.zip

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

Ответ 4

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

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