Как сравнить содержимое тарбола с папкой
Как сравнить файл tar
(уже сжатый) исходной папки с исходной папкой?
Сначала я создал файл архива, используя
tar -kzcvf directory_name.zip directory_name
Затем я попытался сравнить с помощью
tar -diff -vf directory_name.zip directory_name
Но это не сработало.
Ответы
Ответ 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