копировать и распаковывать файлы на удаленную машину - ant

Мне нужно скопировать zip-файлы с локального компьютера, вставить на удаленный компьютер и разархивировать эти файлы на удаленном компьютере.

Я знаю, что первую часть можно выполнить с помощью scp (скопировать zip-файлы с локального компьютера и вставить на удаленный компьютер), но как выполнить вторую часть с помощью ant?

заранее спасибо


person coolgokul    schedule 16.10.2012    source источник


Ответы (1)


Вы можете использовать задачу sshexec для вызова команды unzip из командной строки на удаленном компьютере. (при условии, что на удаленной машине установлена ​​распаковка).

<!-- local directory containing the files to copy -->
<property name="archives" location="C:\path\to\zipfiles" />
<property name="archives.destination" value="/home/testuser/archives" />
<property name="unzip.destination" value="/home/testuser/unpacked" />

<fileset id="zipfiles.to.copy" dir="${archives}" includes="*.zip" />

<!-- copy the archives to the remote server -->
<scp todir="${user}:${password}@host.example.com:${archives.destination}">
  <fileset refid="zipfiles.to.copy" />
</scp>

<!-- Build the command line for unzip - the idea here is to turn the local
     paths into the corresponding paths on the remote, i.e. to turn
     C:\path\to\zipfiles\file1.zip;C:\path\to\zipfiles\file2.zip... into
     /home/testuser/archives/file1.zip /home/testuser/archives/file2.zip

     For this to work there must be no spaces in any of the zipfile names.
-->
<pathconvert dirsep="/" pathsep=" " property="unzip.files" refid="zipfiles.to.copy">
  <map from="${archives}" to="${archives.destination}" />
</pathconvert>

<!-- execute the command.  Use the "-d" option to unzip so it will work
     whatever the "current" directory on the remote side -->
<sshexec host="host.example.com" username="${user}" password="${password}"
  command="/bin/sh -c '
    for zipfile in ${unzip.files}; do
      /usr/bin/unzip -d ${unzip.destination} $$zipfile ; done '" />

Команда unzip может принимать ряд других параметров, подробности см. на ее справочной странице. Например, опция -j игнорирует любую иерархию каталогов внутри zip-файлов и помещает все извлеченные файлы непосредственно в целевой каталог. И -o принудительно перезапишет существующие файлы в целевом каталоге без запроса.

person Ian Roberts    schedule 16.10.2012
comment
не могли бы вы привести пример, где мне нужно разархивировать все файлы в одном конкретном каталоге и поместить эти разархивированные файлы в другой каталог с помощью sshexec? - person coolgokul; 16.10.2012
comment
классно здорово. работает нормально. два вопроса. 1. как заставить эту программу разархивировать все файлы в одну папку и переместить извлеченные файлы в одну директорию.? 2. если файлы уже разархивированы в целевом каталоге, и если я попытаюсь разархивировать снова, он попросит заменить файлы? как всегда ставить да для замены файлов? заранее спасибо. - person coolgokul; 17.10.2012
comment
@coolgokul Я не совсем уверен, что вы имеете в виду под 1, но я добавил некоторые детали, которые могут помочь. - person Ian Roberts; 18.10.2012
comment
Круто.. работает хорошо.. Мой первый вопрос был, скажем, у меня есть папка с именем sources, в которой много zip-файлов. (file1.zip, abc.zip, 123.zip и папки с именами со специальными символами и т. д.)... теперь мне нужно разархивировать все файлы в папке с исходным кодом и поместить все разархивированные файлы в папку Temp. Вы знаете, как это сделать? - person coolgokul; 18.10.2012
comment
Я думаю, это то, что будет делать мой приведенный выше код: ваш каталог с исходным кодом — это свойство archives (каталог, содержащий исходные zip-файлы на локальной стороне), а ваша папка Temp — это unzip.destination (папка на сервере, где содержимое, распакованное из этих файлов, будет завершить). Если вы хотите, чтобы все разархивированные файлы попадали непосредственно в Temp, а не в подкаталоги, вам просто нужно добавить -j, то есть unzip -j -d ${unzip.destination} .... - person Ian Roberts; 18.10.2012