Linux Определите размер Zip без сжатия

Подобные вопросы задавались и раньше. Ближайшим из них является Как смонтировать несколько каталогов в одном разделе? где этот принятый в настоящее время ответ предполагает, что это может быть двумя способами:

  • Использование четырех _символических ссылок: в корневая файловая система, указывающая на четыре отдельных поддерева на втором диске, который сам монтируется один раз в точку монтирования независимо от четырех каталогов.

  • Использование bind mounts (доступно начиная с Linux 2.4) для монтирования четырех отдельных поддеревьев на втором диске в четыре каталога после того, как второй диск будет впервые смонтирован в точку монтирования, независимую от четырех каталогов.

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

Однако systemd имеет функцию явной конфигурации зависимостей, называемую RequiresMountsFor . Например. стандартный Debian 8 (Jessie) использует его, чтобы заставить некоторые службы ждать потенциальных монтирований / var , которые должны быть доступны для рассматриваемых служб.

systemd RequiresMountsFor будет работать только с привязками ; не с символическими ссылками .

По крайней мере, файлы конфигурации службы Debian 8 systemd , о которых идет речь, находятся в / lib / systemd , поэтому их нельзя изменять. Это говорит о том, что bind mounts предпочтительнее, если вы используете дистрибутив Linux, который вводит такие зависимости systemd . Изменение конфигурации systemd дистрибутива Linux может превратить обслуживание системы в кошмар.

Само присутствие systemd , с другой стороны, не является аргументом в пользу выбора между символическими ссылками и привязками .

0
12.12.2018, 13:02
3 ответа

Из справочной страницы zip:

Streaming input and output. zip will also accept a single dash ("-") as the zip file name, in which case it will write the zip file to standard output, allowing the output to be piped to another program.

Так:

$ zip -r - foo | wc -c

Сообщит вам размер сжатого каталога foo в байтах.

7z не может записывать в стандартный вывод zip-файлы.

Другой альтернативой является создание диска памяти и сжатие на него.

3
28.01.2020, 02:16

Делать

tar  cf  >(wc -c)  <file_name_arguments>;  sleep 1
Вместо записи в файл, tarзапишет в канал команду wc -c, который сообщит о количестве записанных в него байтов. (Включите любые tarпараметры, необходимые для сжатия. )При этом используется функция «замены процесса» bash. Используйте sleep 1, потому что без него ваша оболочка выдаст следующее приглашение оболочки когда команда tarзавершится, и не будет ждать завершения команды wc.

Если у вас нет bash, вы, вероятно, можете сделать то же самое с именованным каналом.

0
28.01.2020, 02:16

Вы можете сжимать в StdOut и подсчитывать байты, но AFAIK zipне сжимает в stdout (, как и 7z, другая утилита, которая может создавать ZIP-формат )(*).

В Linux вы обычно создаете файлы.tar.gz, а утилиты выводят на стандартный вывод, если выходной файл не указан:

# compute size
outputSize=$(tar -cz the_directories | wc -c)
# create file
tar -czf some.tar.gz the_directories

Обратите внимание, что в любом случае, если вы выполняете сжатие дважды, вы не можете реально предсказать размер вывода без выполнения преобразования.

(*)возможно, из-за того, что вы не можете декодировать ZIP-файл, не увидев сначала конец.

2
28.01.2020, 02:16

Теги

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