Перенаправить распакованный вывод в определенный каталог, используя Perl - PullRequest
0 голосов
/ 16 декабря 2009

Я хочу распаковать сжатый файл, скажем, files.zip, в каталог, который отличается от моего рабочего каталога. Скажем, мой рабочий каталог /home/user/address, и я хочу разархивировать файлы в /home/user/name.

Я пытаюсь сделать это следующим образом

#!/usr/bin/perl
use strict;
use warnings;

my $files= "/home/user/name/files.zip"; #location of zip file
my $wd = "/home/user/address" #working directory
my $newdir= "/home/user/name"; #directory where files need to be extracted
my $dir = `cd $newdir`;
my @result = `unzip $files`; 

Но при запуске вышеизложенного из моего рабочего каталога все файлы распаковываются в рабочий каталог. Как перенаправить несжатые файлы на $newdir?

Ответы [ 4 ]

8 голосов
/ 16 декабря 2009
unzip $files -d $newdir
3 голосов
/ 16 декабря 2009

Использовать команду Perl

chdir $newdir;

, а не обратная связь

`cd $newdir`

, который просто запустит новую оболочку, изменит каталог в этой оболочке и завершит работу.

1 голос
/ 16 декабря 2009

Хотя в этом примере опция -d для разархивирования, вероятно, является самым простым способом сделать то, что вы хотите (как упомянуто ennuikiller), для других типов смены каталогов мне нравится модуль File :: chdir, который позволяет локализовать изменения каталога, когда они объединены с локальным оператором perl:

#!/usr/bin/perl
use strict;
use warnings;
use File::chdir;

my $files= "/home/user/name/files.zip"; #location of zip file
my $wd = "/home/user/address" #working directory
my $newdir= "/home/user/name"; #directory where files need to be extracted
# doesn't work, since cd is inside a subshell:   my $dir = `cd $newdir`;
{ 
   local $CWD = $newdir;
   # Within this block, the current working directory is $newdir
   my @result = `unzip $files`;
}
# here the current working directory is back to what it was before
0 голосов
/ 16 декабря 2009

Вы также можете использовать модуль Archive :: Zip. Посмотрите конкретно на extractToFileNamed:

"extractToFileNamed ($ fileName)

Извлеките меня в файл с указанным именем. Файл будет создан с режимами по умолчанию. Каталоги будут создаваться по мере необходимости. Аргумент $ fileName должен быть допустимым именем файла в вашей файловой системе. Возвращает AZ_OK в случае успеха. «

...