bzip2: проверить размер файла в распакованном виде, не распаковывая его

Вместо этого я бы использовал существующий пакет Debian PHP 7.1 ...

В любом случае, отвечая на ваш вопрос, описанный вами процесс упаковки действителен. Чтобы ответить правильно, нам нужно подробно просмотреть ваши файлы debian/controlи debian/rules, но ошибку, которую вы видите, легко исправить :, источник PHP не использует DESTDIR, для этого требуется INSTALL_ROOTвместо переменной. Вdebian/rules:

override_dh_auto_install:
        dh_auto_install -- INSTALL_ROOT=$(CURDIR)/debian/php

, так как вы создаете один phpдвоичный пакет.

2
12.10.2019, 14:22
2 ответа

Как упоминалось в комментариях и связанном ответе, единственный надежный способ — распаковать (в канале )и выполнить подсчет байтов.

$ bzcat file.bz2 | wc -c
1234

В качестве альтернативы найдите какой-нибудь инструмент, который делает это без лишней трубы (, может быть немного более эффективным):

$ 7z t file.bz2
[...]
Everything is Ok
Size:       1234

Это также относится к gzip и другим форматам. Хотя gzip -l file.gzпечатает размер, это может быть неверный результат. Как только файл достигает определенного размера, вы получаете что-то вроде:

$ gzip --list foobar.gz 
         compressed        uncompressed  ratio uncompressed_name
           97894400            58835168 -66.4% foobar
$ gzip --list foobar.gz 
         compressed        uncompressed  ratio uncompressed_name
         4796137936                   0   0.0% foobar

Или если файл был объединен или просто неправильно создан:

$ truncate -s 1234 foobar
$ gzip foobar
$ cat foobar.gz foobar.gz > barfoo.gz
$ gzip -l barfoo.gz 
         compressed        uncompressed  ratio uncompressed_name
                 74                1234  96.0% barfoo
$ zcat barfoo.gz | wc -c
2468

Размер не соответствует, так что это ненадежно.

Иногда можно схитрить, смотря что внутри архива. Например, если это сжатый образ файловой системы с заголовком метаданных в начале, вы можете распаковать только этот заголовок, а затем прочитать из него общий размер файловой системы.

$ truncate -s 1234M foobar.img
$ mkfs.ext2 foobar.img
$ bzip2 foobar.img
$ bzcat foobar.img.bz2 | head -c 1M > header.img
$ tune2fs -l header.img
tune2fs 1.45.4 (23-Sep-2019)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          95b64880-c4a7-4bea-9b63-6fdcc86d0914
[...]
Block count:              315904
Block size:               4096

Таким образом, извлекая крошечную часть, вы узнаете, что это 315904 блока по 4096 байт, что составляет 1234 МБ.

Нет гарантии, что это будет реальный размер сжатого файла, (он может быть больше или меньше, )но если не принимать никаких странных вещей, в любом случае он заслуживает большего доверия, чем gzip -l.

И последнее, но не менее важное: если эти файлы были созданы вами, просто запишите их размер.

6
27.01.2020, 22:08

На этот вопрос уже был дан ответ здесь . Вставлено ниже:

Как отмечают другие, bzip2 не предоставляет много информации. Но этот метод работает --вам придется распаковать файл, но вам не нужно будет записывать распакованные данные на диск, что может быть для вас «достаточно хорошим» решением:

$ ls -l foo.bz2
-rw-r--r-- 1 ~quack ~quack 2364418 Jul  4 11:15 foo.bz2

$ bzcat foo.bz2 | wc -c         # bzcat decompresses to stdout, wc -c counts bytes
2928640                         # number of bytes of decompressed data

Вы можете направить этот вывод во что-то еще, чтобы получить форму, -удобочитаемую для человека:

$ ls -lh foo.bz2
-rw-r--r-- 1 quack quack 2.3M Jul  4 11:15 foo.bz2

$ bzcat foo.bz2 | wc -c | perl -lne 'printf("%.2fM\n", $_/1024/1024)'
2.79M
2
27.01.2020, 22:08

Теги

Похожие вопросы