web-dev-qa-db-ja.com

tarballのコンテンツをフォルダーと比較する方法

元のフォルダーのtarファイル(圧縮済み)を元のフォルダーと比較するにはどうすればよいですか?

まず、を使用してアーカイブファイルを作成しました

tar -kzcvf directory_name.Zip directory_name

それから私は使用して比較しようとしました

tar -diff -vf directory_name.Zip directory_name

しかし、それはうまくいきませんでした。

21
Steve

--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アーカイブでも機能します。

36
zzeroo

--diffである必要があります

これを試してください(最後のdirectory_nameなしで):

tar --diff -vf directory_name.Zip

問題は、-diffコマンドがtarファイルとフォルダーの間の既存のファイルの違いのみを検索することです。したがって、新しいファイルがフォルダーに追加された場合、diffコマンドはこれを報告しません。

6
miquel

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

最近、「tar --diff」が生成したものよりも優れた比較が必要だったので、次の短いスクリプトを作成しました。

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