多くのファイルとフォルダを含む大きくて重いフォルダツリーがあります。圧縮してストレージ容量を減らしたいです。このツリーは頻繁には使用されませんが、後でツリーをナビゲートし、ここから特定の1つまたは2つのファイルを抽出する必要があるようです。
したがって、ツリー全体を含む巨大な圧縮tarファイルを使用したくありません。これは後でナビゲートするのが非常に困難になり、ファイルを抽出するためにすべてのアイテムを解凍する必要があるためです。そうですか?また、tarファイルが準備されて元のツリーを削除できるようになるまで、2倍のスペースが必要です。
そのため、bz2やxzのようなものを使用し、各ファイルを個別に圧縮したいと思います。しかし、サブフォルダに小さくて似たようなファイルが多い場合、各ファイルを圧縮することは、すべてのファイルを1つのtarファイルにまとめて圧縮するのと同じくらい効果的ではないようです。 (圧縮する情報がさらにある場合は、コンプレッサーがより冗長性を見つけることができると仮定します。)
だから私は何をすべきですか?
最適な圧縮のためにファイルを収集するアイデアは、後で情報を簡単にナビゲートして抽出するために別々に保存するというアイデアとは反対です。中点を選択するツールや推奨方法はありますか?たとえば、すべての最終フォルダ(ツリーの各四半期の終わりにあるフォルダ)を検索し、最初にその内容をtarで圧縮してから圧縮してから、上記の深さまで繰り返し続ける必要がありますか?
編集:テストケース
単一ファイルで使用される圧縮とすべてのファイルで使用される圧縮とをxz
比較しました7z
。テストケースは58000.66Mのフォルダツリーで構成されており、その中に1250397個のファイルが4290個のディレクトリに分類されています。すべてを圧縮した後:
find . -type f -print0 | xargs -0 xz
私は14576.68Mを得ます。ただし、ツリー全体を圧縮すると、7z
ほぼ5 GBの少ない9622.74Mが得られます。
ベストアンサー1
...ファイルを抽出するには、すべてのアイテムを解凍する必要があります...そうですか?
tarを避ける場合はそうではありません。ファイル名を検索し、アーカイブから個々のファイルを抽出するのは簡単です(.zip、.7zの場合は高速)。はい。
> du -h a.*
223M a
115M a.tar.gz
75M a.7z
> 7z l a.7z | wc -l
2253
> ( time 7z l a.7z >/dev/null ) 2>&1 | grep user
user 0m0.014s
> ( time tar -ztf a.tar.gz >/dev/null ) 2>&1 | grep user
user 0m2.055s
...各ファイルを圧縮することは、すべてのファイルを1つのtarファイルに統合してから圧縮するのと同じくらい効果的ではありません。そうなんですか?
正しい。
最初のコメントは、7zはマルチスレッドでインデックス化されていますが、tar.xzはそうではないので、パフォーマンスに大きな違いがあるということです。
ただし、実際には圧縮にファイルシステムまたはデバイスマッパーのみを使用します。
vdo create --name=vdo_volume --device=/dev/vda
圧縮ファイルシステム https://en.m.wikipedia.org/wiki/Category:圧縮ファイルシステム 例えば
mount -t btrfs -o compress=lzo /dev/sdb /media/my_compressed_files
どちらもループバックデバイスで実行できるため、ファイル内のファイルシステム全体のように機能します。
データ検索速度は速いですが、書き込み性能が悪いヒューズ-7z-ngなどのいくつかのアーカイブヒューズドライバもあります。
fuse-7z-ng files.7z /media/my_compressed_files