tar
ディレクトリ全体を単一のファイルとして収集するために使用できます。サブディレクトリなしでいくつかのテキストファイルのみを含むサンプルディレクトリを試しましたsampledir
。元のディレクトリは次を占有します52K
。
$ du -h sampledir/
52K sampledir/
私は走った
$ tar -cf tararchive.tar sampledir/
生成されたファイルは
$ du -h tararchive.tar
40K tararchive.tar
: 小さいですが、sampledir
コマンドから圧縮を要求しません。私はBSDバージョンtar
(Ubuntuでも使用されています)に言及しています。
それでは、それは何をしますかtar
?ディレクトリとすべてのファイルを収集し、終了と開始を示すためにいくつかのヘッダを挿入しますか?それでは、tararchive.tar
圧縮しなくても元のディレクトリよりも小さいのはなぜですか?
ベストアンサー1
これは、ファイルがブロック全体でスペースを消費するためです。したがって、ブロックサイズが512バイトで、100バイトの小さなファイルがある場合、使用される実際のサイズは最も近いブロック(この場合は512)に丸められます。圧縮時に結果は単一のファイルであるため、結果ファイル(.tarファイル)が1つしかないため、非効率性が低下します。
100個の小さなファイルを作成し、そのサイズを個々のファイルと結合ファイルと比較すると、実際にこれを知ることができます。次のコマンドを実行すると、100個のシングルバイトファイルを含むディレクトリが作成され、個々のサイズ、1つのファイルに結合されたすべてのファイルのサイズ、および生成されたtarballのサイズが比較されます。
mkdir tmp_small_file_test
for ((i=0; i<100; i++)); do head -c 1 /dev/zero > tmp_small_file_test/file$i; done
du -sh tmp_small_file_test
#on a 4096 byte block size filesystem this output 404K
cat tmp_small_file_test/file* >> tmp_small_file_test/all_files_combined
du -sh tmp_small_file_test/all_files_combined
#this output 4.0K
rm -f tmp_small_file_test/all_files_combined
tar -cf tmp_small_file_test.tar tmp_small_file_test
du -sh tmp_small_file_test.tar
#this output 116K
注:tar
各ファイルをtarballに保存するのに少しオーバーヘッドがあるため、上記のディレクトリをtarすると、tarファイルはすべてのファイルをまとめたものほど小さくはありませんが、それでもファイル自体よりはるかに小さい(少なくともブロックサイズは4096ファイルシステム) 。
ext3/ext4ファイルシステムを使用している場合は、次の方法でブロックサイズを表示できますtune2fs -l /dev/sda1 |grep -i 'block size'
(使用しているファイルシステムに/ dev / sda1を置き換えます)。結果は、du
上記の最初の値を100で割ったものでなければなりません。