backup2.tar.bz2にはあるがbackup1.tar.bz2にはないすべてのファイルをリストします。

backup2.tar.bz2にはあるがbackup1.tar.bz2にはないすべてのファイルをリストします。

両方のバックアップ内のすべてのファイルがサイズでソートされて一覧表示されます。

tar tvf backup1.tar.bz2 |sort -k3 -n >backup1_files.txt
tar tvf backup2.tar.bz2 |sort -k3 -n >backup2_files.txt

一覧表示したいbackup2.tar.bz2にはあるがbackup1.tar.bz2にはないすべてのファイル、サイズでソートされます。

どうすればいいですか?


気づく:

答え1

AWKがある場合は、次の1行のコードを使用できます。

awk '{if (NR==FNR) { arr[$6]=1 } else { if (! arr[$6]) { print } } }' backup2_files.txt backup1_files.txt

次に、バックアップ2のファイル名を使用してAWK配列を構築し、バックアップ1のファイル名が配列に存在することを確認します。それ以外の場合は印刷されます。

編集:名前にスペースが含まれているファイルに対して、より強力で一時的なファイルを必要としない拡張バージョンは次のとおりです。

 awk '{ key=""; for (i = 6; i <= NF; i++) { key=col_cat $i }; if (NR == FNR) { arr[key]=1 } else { if (! arr[key]) { print } } }' <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)

awkコードをファイルに書き込んintersect.awkで、次のように再利用できます。

awk -f intersect.awk <(tar tvf backup2.tar.bz2 |sort -k3 -n) <(tar tvf backup1.tar.bz2 |sort -k3 -n)

答え2

tarが印刷するため、他の回答で提案されたアプローチは機能しません。

name123 symbolic link to namexyz

アーカイブとハードリンクにシンボリックリンクがある場合は、同様のメッセージが表示されます。

したがって、この問題を処理する唯一の方法は、次の方法を使用することですstar

star -t -tpath < archive.tar.bz2 > somename

すべてのアーカイブに対してこれを行い、出力をソートし、よく知られた方法を使用して結果ファイルを比較します。

このオプションは、ファイル名を1行に1回だけ印刷するように指示-tpathします。star

starはい、それの一部ですschilytools

注:この方法では、ファイル名に改行文字が含まれている場合は比較ツールを混同します。

関連情報