3

В настоящее время я сжимаю список файлов из каталога в следующем формате:

tar -cvjf test_1.tar.gz -T test_1.lst --no-рекурсия

Приведенная выше команда сжимает только те файлы, которые указаны в списке. Я делаю это, потому что этот список создан так, что он подходит для DVD. Однако во время сжатия степень сжатия уменьшает предполагаемый размер файла, и на DVD остается много свободного места. Это что-то вроде алгоритма ранца.

Я хотел бы оценить размер сжатого файла и добавить еще несколько файлов в список. Я обнаружил, что можно оценить размер файла с помощью следующей команды:

tar -cjf - Папка / | туалет

Эта команда не принимает параметр списка. Есть ли способ оценить размер сжатого файла? Я также ищу варианты, такие как сценарии Perl и т.д.

Редактировать:

Я думаю, что должен предоставить больше информации, так как я много занимался веб-поиском. Я натолкнулся на Perl-скрипт (Link), который имитирует алгоритм ранца.

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

Есть 2 способа, которыми я мог бы решить неэффективность:

а) Сжать отдельные файлы и сохранить их в каталоге с помощью сценария. Сжатый файл может дать наилучшую оценку. Я мог бы сгенерировать скрипт, используя папку сжатых файлов и использовать их на несжатых.

б) Убедитесь, что размер сжатого файла меньше необходимого размера. Если так, я должен продолжать добавлять файлы, пока я не отвечу требованию. Однако добавление новых файлов в сжатый файл само по себе является проблемой оптимизации.

1 ответ1

1

Изменить 2:

Я перечитал ваш вопрос и нашел новый способ его интерпретации. Просто найти размер файла после сжатия, используя что-то вроде bzip2 -k $file | wc -c для каждого файла. Это, однако, не решит вашу проблему, так как вас интересует не размер каждого сжатого файла, а сжатый размер архива, содержащего все ваши файлы (и насколько он увеличивается, если вы добавляете конкретный файл). Разница в размере от сжатия не является линейной, но на самом деле довольно непредсказуемой, поэтому она является плохим предиктором для второго.

Примером являются два идентичных файла размером 10 МБ, где оба сжимаются по отдельности до 1 МБ, а тарбол, содержащий оба, также сжимается до 1 МБ.

Оригинальный ответ

Я полагаю, что общее решение состоит в том, чтобы просто разделить сжатые данные с помощью split, что означает, что вам нужны все доступные диски, если вы хотите восстановить файл с любого из них. Я думаю, что tar имеет встроенный механизм разделения, но он работает только с объемом несжатых данных, что дает плохие результаты при сжатии и неоднородных файлах.

Другое решение (далеко не идеальное) работает, если вы можете иметь ручное вмешательство и может быть достаточно. Это работает лучше всего, если ваши файлы большие по сравнению с желаемым размером тома

Я так понимаю, у вас есть целевой объем тома, в МиБ. В примере я использую 700 MiB.

Если вы бежите

tout="/tmp/09b00c50a9625deeb1089b3c4358c5e5" #or something else
csize="7" # in MiB
mkfifo "$tout"
tar -cvj ~/ 2>"$tout" | dd bs=1M count="$csize" of=/dev/null iflag=fullblock 2>/dev/null &
tail -20 "$tout" | xargs -n 1 ls -ld
rm "$tout"

tar распечатает все файлы, которые он пытается сжать в канал, пока dd не получит 700 МБ сжатых данных. tail читает последние 20 файлов, которые tar пытался сжать из fifo.

Последний напечатанный файл (по крайней мере) не сможет соответствовать размеру вашего тома. Из-за кэширования как в tar и в bzip2 , некоторые из последних файлов также могут не подходить, поэтому вам, возможно, придется немного поэкспериментировать с тем, сколько из них вы пропустите. Если все файлы очень малы, вам, возможно, придется распечатать tail чтобы распечатать более 20 из них, чтобы увидеть тот, который перевернет вас.

Редактировать:

Вы даже можете записать имена файлов в свой список файлов напрямую (с помощью подходящего фильтра для удаления каталогов) и просто удалить последние несколько строк в текстовом редакторе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .