元のフォルダーのtar
ファイル(圧縮済み)を元のフォルダーと比較するにはどうすればよいですか?
まず、を使用してアーカイブファイルを作成しました
tar -kzcvf directory_name.Zip directory_name
それから私は使用して比較しようとしました
tar -diff -vf directory_name.Zip directory_name
しかし、それはうまくいきませんでした。
--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アーカイブでも機能します。
--diffである必要があります
これを試してください(最後のdirectory_nameなしで):
tar --diff -vf directory_name.Zip
問題は、-diffコマンドがtarファイルとフォルダーの間の既存のファイルの違いのみを検索することです。したがって、新しいファイルがフォルダーに追加された場合、diffコマンドはこれを報告しません。
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
最近、「tar --diff」が生成したものよりも優れた比較が必要だったので、次の短いスクリプトを作成しました。
#!/bin/bash
tar tf "$1" | while read ; do
if [ "${REPLY%/}" = "$REPLY" ] ; then
tar xOf "$1" "$REPLY" | diff -u - "$REPLY"
fi
done