이미 압축된 파일을 압축하지 않도록 gzip/bzip2/7z/etc에 지시하시겠습니까?

이미 압축된 파일을 압축하지 않도록 gzip/bzip2/7z/etc에 지시하시겠습니까?

/home을 tar링하고 bzip2를 통해 파이핑합니다. 그러나 bzip2가 압축을 시도해서는 안 되는 이미 압축된 파일(.jpg, .mp4, .mkv, .webm 등)이 많이 있습니다.

압축할 수 없거나 최소한으로 압축할 수 있는 파일을 백업하지 않을 만큼 똑똑한 CLI 압축기(libmagic 또는 사용자 열거 확장을 통해)가 있습니까?

몇 년 전에도 비슷한 질문을 하신 분이 있었는데, 그 이후로 업데이트가 되었는지는 모르겠습니다. 하위 디렉터리를 사용하여 디렉터리를 압축할 때 특정 파일의 압축을 건너뛰도록(포함하지는 않음) 7z에 명령할 수 있습니까?

답변1

귀하가 수행하는 방식(파일 압축)에 따르면 .tar대답은 확실히 '아니요'입니다.

파일을 압축하는 데 무엇을 사용하든 .tar파일의 내용을 알지 못하고 바이너리 스트림만 볼 수 있으며 해당 스트림의 일부가 압축할 수 없는지 또는 최소한으로 압축할 수 있는지 알 수 있는 방법이 없습니다. 스트림의 내용을 이해하는 것이 "어리석은" 만큼 압축을 수행하는 명령의 옵션 에 tar혼동 하지 마십시오 .tar --create --xz --file some.tar file1tar --create file1 | xz > some.tar

다양한 작업을 수행할 수 있습니다.

  1. 대신 개별적으로 압축할 수 있는 일부 컨테이너 형식으로 전환할 수 있지만 .tar, 한 디렉터리에 유사한 패턴을 가진 작은 파일이 많이 있는 경우(개별적으로 압축되므로) 이는 불리합니다. zip 형식은 실제 예입니다.
  2. 해당하는 경우 파일을 tar 파일에 넣기 전에 압축할 수 있습니다. 이는 예를 들어 포인트 1의 단점이 있는 Python tarfile및 모듈을 통해 bzip2투명하게 수행될 수 있습니다 . 그리고 일부 파일은 압축되어 압축을 풀 필요가 없기 때문에(백업 전에 이미 압축되었기 때문에) tar 파일에서 직접 추출할 수 없습니다.
  3. tar를 있는 그대로 사용하고 이런 일이 발생한다는 사실을 받아들이고 너무 높지 않은 압축을 선택하십시오. gzip// bzip2그러면 xz스트림을 너무 세게 압축하지 않고 또 다른 0.5% 압축을 얻으려고 시간을 낭비하지 않게 됩니다. 일어나지 않을 것입니다.

내 사이트에 게시한 것처럼 병렬 압축 결과 xz(tar 파일에만 국한되지 않음)를 보고 속도를 높이려는 결과를 확인할 수도 있습니다.xz블로그

답변2

이것LZ4 알고리즘옵션일 수도 있습니다.

블록의 시작 부분이 압축 가능한지 확인하고 비율이 낮으면 압축되지 않은 상태로 저장합니다. 이는 이름을 지정하지 않고 이미 압축된 파일의 압축을 성공적으로 방지합니다.

말씀하신 알고리즘에 비해 전체 압축률이 낮습니다. 그러나 LZ4는 반면에 매우 빠릅니다. 수백 MiB/s의 압축 및 GiB/s 압축 해제 속도를 쉽게 달성할 수 있습니다.

예:

# Compression (creates <inputfile>.lz4)
lz4c <inputfile>

# Decompression
lz4c -d <inputfile>

# Use with tar
tar cf - <directory> | lz4c > <directory>.tar.lz4

# Use with GNU tar
tar cf <directory>.tar.lz4 -I lz4c <directory>

관련 정보