rsyncに似たアーカイブファイルの更新

rsyncに似たアーカイブファイルの更新

更新バックアップを使用すると、rsync --include-from=files --exclude-deleted次のようなフィードバックを得ることができます。

Added file: new.file
Added file: other.file
Deleted file: deleted.file
etc.

標準のUNIXアーカイブツール(zip、tarなど)を使用して同じ目的を達成できますか?アーカイブに新しいファイルが追加され、削除されたファイルは削除されますか?

たとえば、zip -ru@ out < filesインクルードリストに基づいてアーカイブを更新しますが、削除されたファイルがある場合いいえ削除されました。したがって、アーカイブには残りのゴミがたくさん残っています。

もちろん、アーカイブを削除して全体を再作成することはできますが、すべてのファイルが追加されたことを示す数千行の出力が得られるので、言えば「増分」出力は得られません。

(追加の質問は、インクルードファイルにワイルドカードベースのファイルを含める方法ですが、別の質問に適している可能性があります。)

答え1

zipのオプションが利用可能です--filesync

~から郵便番号(1)マニュアルページ:

-FS

--ファイル同期 アーカイブされたコンテンツをオペレーティングシステムのファイルと同期します。通常、アーカイブを更新すると、新しいファイルが追加され、変更されたファイルは更新されますが、オペレーティングシステムに存在しなくなったファイルはアーカイブから削除されません。このオプションを使用すると、ファイルシステムのアーカイブ内のエントリを確認する新しいモードを使用できます。エントリのファイル時間とファイルサイズがオペレーティングシステムファイルのファイル時間とファイルサイズと一致する場合、そのエントリはファイルシステムから読み取られ、圧縮されるのではなく古いアーカイブからコピーされます。オペレーティングシステムファイルが変更された場合は、通常どおりエントリを読み込んで圧縮します。アーカイブのエントリがオペレーティングシステムのファイルと一致しない場合、エントリは削除されます。このオプションを有効にすると、新しいアイテムと同じアーカイブが作成されますが、既存のアイテムは圧縮されずにコピーされるため、既存のアーカイブは次のように更新できます。-FS新しいプロファイルを作成するよりもはるかに高速です。また、使用を検討することができます- ゆうファイルを更新するために使用されます。このオプションが機能するには、相対パスが一致するようにアーカイブが作成されたのと同じディレクトリでアーカイブを更新する必要があります。古いアーカイブからコピーされたファイルがほとんどない場合は、新しいアーカイブを作成する方が速くなる可能性があります。このオプションを正しく機能させるには、タイムゾーン環境変数TZをローカルタイムゾーンに従って設定する必要があります。元のアーカイブが作成されてからタイムゾーンが変更されると、すべてのファイルの時刻の一致と再圧縮が失敗する可能性があります。

このオプションはアーカイブからファイルを削除します。元のアーカイブをアーカイブする必要がある場合は、まずアーカイブのコピーを作成するか、- 出る更新されたアーカイブを新しいファイルに出力するオプション。遅くなる可能性がありますが、新しいアーカイブ名で新しいアーカイブを作成することは、アーカイブとオペレーティングシステムのパス間の矛盾を防ぐために、より安全で優先されます。

例:

user@host:~/$ mkdir compressme; echo "Lorem Ipsum" >compressme/file1; echo "Lorem Ipsum" >compressme/file2; echo "Lorem Ipsum" >compressme/file3
user@host:~/$ zip -r --filesync all.zip compressme
  adding: compressme/ (stored 0%)
  adding: compressme/file2 (stored 0%)
  adding: compressme/file1 (stored 0%)
  adding: compressme/file3 (stored 0%)
user@host:~/$ rm compressme/file2
user@host:~/$ zip -r --filesync all.zip compressme
updating: compressme/ (stored 0%)
deleting: compressme/file2

答え2

-u(GNU)tar(1)には(update)があります。しかしそれは確かに適切な場所に更新し、最後に新しいコンテンツを追加するだけです(結果には複数のバージョンのファイルが含まれ、後でクリーンアップすると面白いでしょう...)、-a(追加)、-delete(マニュアルには実際に削除されたかどうかは表示されません) . または存在しないとマークされた場合は後者であると考えられます。

ar(1) 形式 (静的ライブラリで最も一般的に使用されますが、実際のアーカイブ形式) では、d削除、move、およびquick の追加が可能です。

ここで cpio(1) には大きな注意があります。いいえポータブルではないので使えます。

Unix 標準 pax(1) にはファイルの修正に関する規定はありません (ここでは spax(1) が少数の形式を処理することは当然です)。

アーカイブが圧縮されていると幸運ではありません。上記のツールを使用して行うことは、結果をアーカイブして圧縮するだけです。アーカイブの内容を変更するには、アーカイブ全体を再圧縮する必要があります。

zip(1) 形式は個別に圧縮されたファイルの集まりであり、その内容は (相対的に) 追加/削除/移動が容易です。

関連情報