両方のバックアップ内のすべてのファイルがサイズでソートされて一覧表示されます。
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にはないすべてのファイル、サイズでソートされます。
どうすればいいですか?
気づく:
diff
一部のファイルの変更日が異なるため、.txt ファイルの作成は機能しません。したがって、この質問は重複しません。他のファイルにない限り、ファイルの行をインポートするツールはありますか?。削除すると、
v
変更日が削除され、ファイルサイズも削除されるため、サイズごとに並べ替える方法がないため、これはオプションではありません。
答え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
。
注:この方法では、ファイル名に改行文字が含まれている場合は比較ツールを混同します。