多くのファイルとフォルダを含む大きくて重いフォルダツリーがあります。圧縮してストレージ容量を減らしたいです。このツリーは頻繁には使用されませんが、後でツリーをナビゲートし、ここから特定の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
答え2
tar
このオプションを使用すると、-tvf
gzip、bzip2、xzなどの他のライブラリと組み合わせて、tarで作成されたすべてのアーカイブの内容を一覧表示できます。
tar -tf file.tar
tar -ztf file.tar.gz
tar -jtf file.tar.bz2
tar -Jtf file.tar.xz
コンテンツを一覧表示すると、アーカイブから抽出するファイルを具体的に識別し、特定のパスを使用してファイルを抽出できます。
あなたのパスがだと仮定しますhome/user/old/photos/beach2012/bigbeachball.jpg
。
tar -xf file.tar home/user/old/photos/beach2012/bigbeachball.jpg
tar -zxf file.tar.gz home/user/old/photos/beach2012/bigbeachball.jpg
tar -jxf file.tar.bz2 home/user/old/photos/beach2012/bigbeachball.jpg
tar -Jxf file.tar.xz home/user/old/photos/beach2012/bigbeachball.jpg
アーカイブがあまり変更されない場合(たとえば、ファイルを頻繁に追加または削除しない場合)、いつでもコンテンツをテキストファイルに抽出できます。 grepで検索できるテキストファイルにコンテンツを配置すると、検索するたびにアーカイブを処理するよりもファイルを見つけやすくなります。
答え3
私はこれに非常に興味があり、次のように私が調査したいくつかのオプションがあります。
カボチャのファイルシステム
スカッシュデータをアーカイブして圧縮できますが、後で圧縮されていないかのように移動できるように、ファイルシステムとしてマウントできます。
mksquashfs some/directory dir.squashfs
mkdir mnt
sudo mount -t squashfs dir.squashfs mnt
これはrootとしてのみ実行でき、Linuxでのみ実行できます。しかし、ヒューズを絞るFUSE対応システムでは、root以外のユーザーとしてこれを実行できます。
ピクセル
誰かがすでに言及しています。ピクセル- しかし、単にxzを並列化したわけではありません。またファイルインデックスアーカイブを圧縮して、小規模な作業をより効率的にします。たとえば、
# Listing files, and extracting a single file, using normal tar + xz
# So slow, not practical for interactive use.
$ time tar -tf 8gigs.tpxz > /dev/null
371.99s user 5.45s system 99% cpu 6:21.00 total
$ time tar -xf 8gigs.tpxz dir/somefile.txt
375.04s user 5.45s system 99% cpu 6:21.00 total
# Using pixz instead it's much faster!
$ time pixz -l < 8gigs.tpxz > /dev/null
0.01s user 0.01s system 38% cpu 0.035 total
$ time pixz -x dir/somefile.txt < 8gigs.tpxz | tar x
0.33s user 0.02s system 97% cpu 0.359 total
婦人声明
私はpixzとsquashfuseを書きました。私にもあなたと同じ問題があったからです。