Почему tar/gzip не сжимает два одинаковых больших каталога?

Правила шаблона в GNU make не будут учитываться, если их предварительные требования не разрешаются в существующие файлы, либо напрямую, либо рекурсивно через другие правила шаблона[1]:

$ make -f <(echo '%.foo: %.bar file.txt;') a.foo
make: *** No rule to make target 'a.foo'.  Stop.

$ touch a.bar
$ make -f <(echo '%.foo: %.bar file.txt;') a.foo
make: *** No rule to make target 'a.foo'.  Stop.

$ touch a.bar file.txt
$ make -f <(echo '%.foo: %.bar file.txt;') a.foo
make: 'a.foo' is up to date.

Поскольку ваш макрос TestNeededObjectFileвключает ложные +s, и у вас, вероятно, нет ни одного файла с таким именем, это нарушит правило $(TestDir)/%.out:.

[1] согласно руководству GNU make :

In order for the pattern rule to apply, its target pattern must match the file name under consideration and all of its prerequisites (after pattern substitution) must name files that exist or can be made. These files become prerequisites of the target.

0
10.07.2020, 09:03
1 ответ

Да, ваши рассуждения верны, так как tar не сортирует файлы по расширениям (, что могло бы сильно помочь в достижении более высоких степеней сжатия ), а gzip— очень старый алгоритм сжатия с относительно скромным словарь, всего 32 КБ.

Попробуйте вместо этого использовать xzили p7zip.

Вот строка сжатия, которая позволяет мне добиться максимальной степени сжатия под Linux:

7za a -mx=9 -myx=9 -mfb=273 -bt -slp -mmt4 -md=1536m -mqs archive.7z [list of files]

Для этого требуется тонна памяти (как минимум 32 ГБ ОЗУ ). Если вы удалите -mmmt4и уменьшите размер словаря до 1024 м, 16 ГБ будет достаточно.

Говоря о сортировке файлов для tar. Я написал скрипт, который делает именно это несколько лет назад:https://github.com/birdie-github/useful-scripts/blob/master/tar_sorted

1
18.03.2021, 23:20

Теги

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