추출된 tar 파일을 다시 작게 만듭니다.

추출된 tar 파일을 다시 작게 만듭니다.

폴더를 .tar.gz 아카이브로 압축했습니다. 포장을 풀고 나면 부피가 거의 두 배로 늘어납니다.

du -sh /path/to/old/folder       = 263M
du -sh /path/to/extracted/folder = 420M

나는 많이 검색한 결과 tar가 실제로 메타데이터를 추가하거나 다른 이상한 작업을 수행함으로써 이 문제를 일으키는 것을 발견했습니다.

md5sum 뿐만 아니라 폴더 안의 파일 2개를 비교했습니다. 전혀 차이가 없으며 체크섬은 정확히 동일한 값입니다. 그러나 하나의 파일 크기는 원본 파일 크기의 두 배입니다.

root@server:~# du -sh /path/to/old/folder/subfolder/file.mcapm /path/to/extracted/folder/subfolder/file.mcapm
1.1M    /path/to/old/folder/subfolder/file.mcapm
2.4M    /path/to/extracted/folder/subfolder/file.mcapm
root@server:~# diff /path/to/old/folder/subfolder/file.mcapm /path/to/extracted/folder/subfolder/file.mcapm
root@server:~# 
root@server:~# md5sum /path/to/old/folder/subfolder/file.mcapm
root@server:~# f11787a7dd9dcaa510bb63eeaad3f2ad
root@server:~# md5sum /path/to/extracted/folder/subfolder/file.mcapm
root@server:~# f11787a7dd9dcaa510bb63eeaad3f2ad

저는 다른 접근 방식을 찾고 있는 것이 아니라 이러한 파일의 크기를 다시 원래 크기로 줄이는 방법을 찾고 있습니다.

어떻게 해야 하나요?

답변1

[이 답변은 GNU tar 및 GNU cp를 가정합니다.]

전혀 차이가 없으며 체크섬은 정확히 동일한 값입니다. 그러나 하나의 파일 크기는 원본 파일 크기의 두 배입니다.

1.1M    /path/to/old/folder/subfolder/file.mcapm
2.4M    /path/to/extracted/folder/subfolder/file.mcapm

파일 .mcapm은 다음과 같을 수 있습니다.부족한. 아카이브 생성 시 -S( ) 옵션을 사용하세요 --sparse.tar

예:

$ dd if=/dev/null seek=100 of=dummy
...
$ mkdir extracted

$ tar -zcf dummy.tgz dummy
$ tar -C extracted -zxf dummy.tgz
$ du -sh dummy extracted/dummy
0       dummy
52K     extracted/dummy

$ tar -S -zcf dummy.tgz dummy
$ tar -C extracted -zxf dummy.tgz
$ du -sh dummy extracted/dummy
0       dummy
0       extracted/dummy

나중에 다음을 사용하여 파일을 "다시 희소화"할 수도 있습니다 cp --sparse=always.

$ dd if=/dev/zero of=junk count=100
...
$ du -sh junk
52K     junk
$ cp --sparse=always junk junk.sparse && mv junk.sparse junk
$ du -sh junk
0       junk

답변2

@mosvy는 파일이 희박할 수 있다고 지적했습니다. 다시 아카이브하고 tar --sparse작업을 추출하거나 다음을 수행할 수 있습니다.파일 시스템의 기존 파일을 다시 희소하게 만들려면 다음 명령을 사용하십시오.
fallocate -d
(util-linux에서) 내부 홀 펀칭.

for f in **/*some*pattern*;do
    fallocate --dig-holes "$f"
done

이것매뉴얼 페이지이 옵션을 다음과 같이 설명하세요.

이 옵션을 작업을 수행 cp --sparse한 다음 추가 디스크 공간 없이 대상 파일의 이름을 원본 파일로 바꾸는 것으로 처리할 수 있습니다.


리눅스 지원fallocate(2)시스템 호출을 사용하면 범위를 구멍으로 바꾸는 대신 파일의 페이지 크기 구멍을 닫거나 확장하여 파일을 줄이거나 늘리는 등의 멋진 기능을 사용할 수 있습니다. 이는 기본 FS가 다양한 Fallocate 기능을 각각 지원하는지 여부와 일반적으로 스파스 파일/범위를 지원하는지 여부에 따라 다릅니다.

또한 예를 들어 조각화를 방지하기 위해 토렌트를 다운로드하기 전에 기록되지 않은 범위(홀과 유사하지만 디스크 공간을 예약)를 사전 할당할 수 있습니다. 이름의 "배포"는 여기서 유래되었습니다.

util-linux가 실행될 수 있는 다른 커널은 IDK라는 이 기능의 일부 또는 전부를 지원할 수 있습니다. 그게 작동하지 않으면cp --sparse많은사전 할당된 범위, 구멍 뚫기, 특히 기존 데이터 간의 구멍 확장 또는 축소보다 훨씬 더 뛰어납니다.

관련 정보