Как сделать «системный вызов tar-файлов (вместе с тегом exclude)» для работы в Perl - PullRequest
1 голос
/ 04 апреля 2010

Это системный вызов, который я делаю прямо сейчас в perl для tar файлов

system("${tarexe} -pcvf $tarname $includepath") which works fine.

$tarexe -> location of my tar.exe file
$tarname -> myMock.tar
$includepath -> ./input/myMockPacketName ./input/myPacket/my2/*.wav ./input/myPacket/my3 ./input/myPacket/in.html 

Теперь я хочу исключить некоторые файлы, используя тег exclude, который не исключает файлы

system("${tarexe} -pcvf $tarname $includepath --exclude $excludepath")

$excludepath -> ./input/myMockPacketName/my3

Та же самая запись

${tarexe} -pcvf $tarname $includepath --exclude $excludepath  

не работает, когда я запускаю ее в командной строке.

Ответы [ 3 ]

3 голосов
/ 04 апреля 2010

Понятия не имею, почему ваш --exclude не работает. Но я дам тебе мой любимый совет Perl, когда увижу system в использовании.

Не

Конечно, иногда они необходимы, но сначала проверьте, есть ли модуль CPAN для выполнения этой работы. В этом случае я предлагаю Archive :: TarGzip , как правило, я бы использовал Archive :: Tar , но я не смог найти --exclude функциональность (у меня был только быстрый взгляд, так что может быть там)

2 голосов
/ 04 апреля 2010

Не прямой ответ на вопрос, а подсказка, которая может помочь вам определить такие проблемы в будущем:

Вместо записи

system("${tarexe} -pcvf $tarname $includepath --exclude $excludepath")

сделать что-то вроде

my $command = "${tarexe} -pcvf $tarname $includepath --exclude $excludepath"  ;

print "About to run $command\n" ;
system $command ;

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

Отказ от ответственности - Я согласен с большинством людей, которые ответили на этот вопрос, что использование модулей Perl Tar было бы лучше, но допускаю, что для этого могут быть причины

1 голос
/ 04 апреля 2010

@ суперзвезда -

Чтобы ответить на ваш конкретный вопрос, --exclude, вероятно, должно быть "./input/myMockPacketName/my3/*" вместо "./input/myMockPacketName/my3" из того, что я помню из GNU tar. Кроме того, включенные имена файлов должны идти после --exclude вещи; который должен быть указан правильно

НО

Почему требования говорят вам, КАК делать что-то, а не ЧТО делать?

Если это не домашнее задание (в этом случае, пожалуйста, будьте откровенны)

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

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

...