ディレクトリにTARアーカイブと同じファイルが含まれていることを確認する方法は?

ディレクトリにTARアーカイブと同じファイルが含まれていることを確認する方法は?

フォルダDocumentsとTARファイルがあるとしますDocuments.tar。 tarファイルにディレクトリ内の同じファイルが含まれていることをどのように確認できますか?

私にとってより確実な解決策は次のとおりです。

$ tar xvf Documents.tar -C untarDocs
$ diff -r Documents untarDocs

残念ながら、大容量TARファイルの場合は非常に遅いです。他のオプションはありますか?

(または--diff、--compare)を使用すると、tar -dvf Documents.tarファイルシステムには存在するがTARファイルにはないファイルを検出できないため、機能しません。 TARファイルにはあるがTARにはないファイルのみを検出します。ファイル。ファイルシステムの例:

$ mkdir new
$ touch new/foo{1..4}
$ tar cvf new.tar new/
$ touch new/bar
$ tar --diff --verbose --file=new.tar       #### doesn't detect new/bar #########
$ rm new/foo1
$ tar --diff --verbose --file=new.tar

出力

new/
new/foo2
new/foo3
new/foo4
new/foo1
tar: new/foo1: Warning: Cannot stat: No such file or directory   ### works ###

答え1

ファイル名のリストとディレクトリ名のリストのみを比較したい場合は、この-dオプションは役に立ちません。代わりに、findソートされたリストtar -tfそれ

OPの元の例で想定した名前から始めます。

$ tar xvf Documents.tar -C untarDocs
$ diff -r Documents untarDocs

以下は、ファイル名を区別するために提案されたスクリプトです。

#!/bin/sh
MYDIR=$(mktemp -d)
tar tf Documents.tar |sort >$MYDIR/from-tar
find Documents |sort >$MYDIR/from-dir
(cd $MYDIR && diff -r from-tar from-dir)
rm -rf $MYDIR

これは、Documents.tar同じトップレベルの「Documents」ディレクトリが含まれていると仮定します。これが良い仮定ではない場合は、リストをフィルタリングして最上位ディレクトリの名前を削除する必要があります。しかし、OPはこれが問題になることを示していません。

それにもかかわらず、プログラムがどの順序を使用するかはtar保証できないため、リストを並べ替える必要があります。find

使ったmktempOPはGNU tar(-dオプション)、これはLinuxで可能です。

もちろん、参照するPOSIX tarはありません-d公園違いはありません。

答え2

標準のtarアーカイブではこれは不可能です。これは、標準のtarアーカイブにディレクトリの内容のリストが含まれていないためです。

star増分バックアップをアーカイブするために必要なすべてをstarに通知するときに発生する機能強化により、次のように機能します。

1)star -c -dump -C somedir . > /tmp/tarfile

2)star -diff -vv -C comparedir < /tmp/tarfile

このオプションを使用すると、比較されるメタデータの量を減らすことができますdiffopts=。マニュアルページをご覧ください。

関連情報