tar
전체 디렉토리를 단일 파일로 수집하는 데 사용할 수 있습니다. 하위 디렉터리 없이 일부 텍스트 파일만 포함하는 샘플 디렉터리를 사용해 보았습니다 sampledir
. 원래 디렉토리는 다음을 차지합니다 52K
.
$ du -h sampledir/
52K sampledir/
나는 달렸다
$ tar -cf tararchive.tar sampledir/
생성된 파일은
$ du -h tararchive.tar
40K tararchive.tar
:보다 작지만 sampledir
명령에서 압축을 요청하지 않습니다. 나는 BSD 버전 tar
(우분투에서도 사용됨)을 언급하고 있습니다.
그렇다면 그것은 무엇을 하는가 tar
? 디렉토리와 모든 파일을 수집하고 끝과 시작을 표시하기 위해 일부 헤더를 삽입합니까? 그렇다면 tararchive.tar
압축하지 않아도 원래 디렉터리보다 작은 이유는 무엇입니까?
답변1
이는 파일이 전체 블록 단위로 공간을 소비하기 때문입니다. 따라서 블록 크기가 512바이트이고 100바이트의 작은 파일이 있는 경우 사용되는 실제 크기는 가장 가까운 블록(이 경우 512)으로 반올림됩니다. 압축 시 결과는 단일 파일이기 때문에 결과 파일(.tar 파일)이 하나만 있으므로 비효율성이 줄어듭니다.
100개의 작은 파일을 만들고 그 크기를 개별 파일과 결합 파일로 비교해보면 이를 실제로 알 수 있습니다. 다음 명령을 실행하면 100개의 단일 바이트 파일이 포함된 디렉토리가 생성되고 개별 크기, 하나의 파일로 결합된 모든 파일의 크기 및 생성된 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으로 나눈 값이어야 합니다.