Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > perl и gzip


Автор: worsvch 2.11.2013, 10:46
Пишу скрипт на perl, который использует модуль IO::Compress::Gzip. Скрипт сжимает файлы в формат gz. 
Но только вот проблема: 
1. В gz архиве сохраняется вся вложенность каталогов. К примеру, пусть файлы расположены в каталоге c:\files\01_11_2013\
Дак вот в gz архиве они сохраняют всю эту вложенность, то есть в нем также присутствуют каталоги files и 01_11_2013, хотя надо чтобы вложенность отсутствовала и в архиве были только файлы без каталогов
2. Не могу разобраться, как сделать так, чтобы оригинальные файлы сразу удалялись. В линуксе, например, можно сделать просто:
gzip file, результатом выполнения которой будет file.gz, а файла file не останется
Просьба помочь разобраться

Автор: arto 2.11.2013, 10:57
1. не понял проблему. gzip не архиватор, а компрессор.
2. perldoc -f unlink

Автор: worsvch 2.11.2013, 11:05
Цитата(arto @ 2.11.2013,  10:57)
1. не понял проблему. gzip не архиватор, а компрессор.
2. perldoc -f unlink

1. Внутри gz-файла файлы лежат так:
\files\01_11_2013\file1.dat
\files\01_11_2013\file2.dat
\files\01_11_2013\file3.dat
и т.д.
а надо, чтобы: 
file1.dat
file2.dat
file3.dat
То есть, чтобы модуль IO::Compress::Gzip не сохранял пути.
2. Про unlink  я в курсе, может ли модуль IO::Compress::Gzip удалять оригинальные файлы после сжатия в gz?

Автор: arto 2.11.2013, 12:05
1. покажите код, как вы это делаете.
2. если в документации нет, то нет.

Автор: worsvch 2.11.2013, 12:23
Часть кода, в которой отрабатывает gzip
Код

if ($trigger == 1) {
        while (readdir BACKUP) {
                if ($_ !~ /^\.{1,2}$/) {
                    if (($_ =~ /dbf$/i) || ($_ =~ /ctl$/i) || ($_ =~ /log$/i)) {
                                                #yesterday - это путь к файлам 
                        my $status = gzip "$yesterday\\$_" => "$yesterday\\$_.gz" or die "gzip failed: $GzipError\n";
                    }
                }
        }

Автор: arto 4.11.2013, 08:50
из приведенного кода не следует, что в .gz файле лежат несколько других файлов

Автор: worsvch 5.11.2013, 09:36
Цитата(arto @ 4.11.2013,  08:50)
из приведенного кода не следует, что в .gz файле лежат несколько других файлов

Не следует, но каждый файл лежит внутри нескольких папок, а надо чтобы открыл gz файл а там сразу файл который сжимал, а получается, что открываешь архив, например в 7-zip, а там папка и чтобы добраться до файла нужно пройти через несколько папок, прежде чем доберешься до самого файла

Автор: arto 5.11.2013, 11:31
ну так и выводите его туда, куда вам надо: => "/tmp/$_.gz".
это к модулю не относится.

Автор: worsvch 5.11.2013, 13:25
Цитата(arto @ 5.11.2013,  11:31)
ну так и выводите его туда, куда вам надо: => "/tmp/$_.gz".
это к модулю не относится.

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

Автор: Pfailed 5.11.2013, 18:27
опцию Name из документации попробуйте

Автор: worsvch 9.11.2013, 14:48
Цитата(Pfailed @ 5.11.2013,  18:27)
опцию Name из документации попробуйте

Сделал по другому, использовал chdir и там уже запускал gzip, результат был, который хотел

Автор: MikaGold 14.11.2013, 19:55
Да уж, для меня всегда сложновато это все было. Разбираете четко, опыт)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)