tarの圧縮をディレクトリに解凍し、アーカイブにないすべてのファイルを削除します。

tarの圧縮をディレクトリに解凍し、アーカイブにないすべてのファイルを削除します。

大きなタールがあり、定期的にその内容を固定位置に抽出するとしましょう。

私は、この場所を抽出されたtarの元のインスタンスとして維持したいと思っており、tarに存在する可能性がある小さな変更を更新するために、常に出力ディレクトリを消去する非常に無駄なプロセスを回避できます--keep-newer-files

しかし、アーカイブに存在しなくなったファイルを出力場所からどのように削除しますか?

ベストアンサー1

標準tarコマンドには、アーカイブの内容をリストする方法があります。その略語はですtar -tf archive.tar

find、およびコマンド置換と組み合わせて使用​​すると、grep次の結果が得られます。

rm -f $(find . -d | head -n -1 | grep -Fv "$(tar -tf archive.tar)")

これを実行存在するコンテンツをアーカイブするディレクトリで、アーカイブファイルarchive.tarのパスに置き換えられます。

最も外側のコマンド置換の内側にあるパイプの場合は、右から左に作業します。

  • find . -d:現在のディレクトリ内のすべてのファイルとディレクトリを深さ優先順に一覧表示します。ここでは、このファイルのリストを削除に使用する予定なので、深さ優先ソートが重要であるため、ディレクトリ自体を削除する前にディレクトリの内容を削除する必要があります。
  • head -n -1:コマンドから最後の行を除外しますfind。これにより、/pathアーカイブに存在するか存在しない可能性がある項目自体が削除されます。奥行き優先順に操作を実行しないと、これになりますtail -n -1
  • grep -Fv "$(tar -tf archive.tar)":アーカイブリストをgrepコマンドに渡すと、返されたリストからその行がフィルタリングされるため、findアーカイブにないファイルのみが外部rmコマンドに渡されます。

いくつかの注意:

  • これではないかもしれません。かなりPOSIX規格に準拠しています。しかし、GNU bashでは動作します。
  • これは、tarがアーカイブの内容を報告する方法と、アーカイブの作成方法によって異なります。特に、リストはfind報告方法と一致する必要があります。 GNU tarとほとんどのアーカイブの場合しなければならない働くあなたの場合に動作しない場合は、最も内側のコマンド置換内またはtarコマンドの出力を使用してsed動作させることができます。awk
  • 本番データで使用する前に確認してテストしてください。上記の2つの理由のいずれかが原因で機能しない場合は、削除することができます。すべて実行するディレクトリを作成します。

おすすめ記事