我正在使用它从A复制到B。但是,例如,如果文件夹/config不存在,它会给我一个例外。我该如何解决?我尝试了mkdirs="true",但也出现了错误
<scp todir="${ftplogin}@${ftpserver}:${ftp-remote-dir}/config" verbose="false" trust="true" failonerror="No">
<fileset dir="${stuff}/${stuff-version}/config${config-files}">
<include name="*.*"/>
</fileset>
</scp>
在进行复制之前,您可以使用sshexec在远程机器上创建目录树。mkdir-p创建目录(如果不存在)。(如何仅在目录不存在的情况下mkdir?)
<sshexec
host="${host}"
username="${remote_user}"
password="${remote_password}"
command="mkdir -p ${remote_dir_path}"
trust="true" />
在scp 之前将其添加到目标
使用scp任务无法创建远程目录。这里有一个scptransfer的macrodef,它完成了传输所需的所有工作从给定的stagedidirectory=>修复linefeeds,createremote,deleteremote,如果stagedir为空则失败。。。等Macrodef正在使用ant addon Flaka,如果您不需要所有这些功能,只需将sshexec任务与mkdir -p
一起使用即可在scp之前创建远程targetdir。
<project xmlns:fl="antlib:it.haefelinger.flaka">
<fl:install-property-handler/>
<macrodef name="scptransfer">
<attribute name="host" default="${aix.host}"/>
<attribute name="userid" default="${aix.userid}"/>
<attribute name="knownhosts" default="${aix.knownhosts}"/>
<attribute name="ppk" default="${aix.ppk}"/>
<attribute name="createremote" default="false"/>
<attribute name="remotedir" default="${eartarget}/${project}/${env}/${module}/${job.id}"/>
<attribute name="deleteremote" default="false"/>
<attribute name="deleteincludes" default="*"/>
<attribute name="stagedir" default="${artifactdir}/${module}"/>
<attribute name="stageincludes" default="**/*.*"/>
<attribute name="stageexcludes" default=""/>
<attribute name="failstageempty" default="true"/>
<attribute name="fixLF" default="false"/>
<attribute name="timeout" default="900000"/>
<attribute name="verbose" default="true"/>
<sequential>
<echo>
=============== SCP Transfer ===============
Project = ${project}
Environment = ${env}
UserID = @{userid}
Targetserver = @{host}
Targetpath = @{remotedir}
fixLF ? = @{fixLF}
createremote ? = @{createremote}
deleteremote ? = @{deleteremote}
#{@{deleteremote} ? 'deleteincludes = @{deletecincludes}' : '' }
Stagedir = @{stagedir}
stageincludes = @{stageincludes}
stageexcludes = @{stageexcludes}
=============== SCP Transfer ===============
</echo>
<!-- contents in stagedir ? -->
<resourcecount property="stagecount">
<fileset dir="@{stagedir}" includes="@{stageincludes}" excludes="@{stageexcludes}" id="stagecontents"/>
</resourcecount>
<fl:choose>
<fl:when test=" ${stagecount} > 0 ">
<!-- Fix Linefeeds for ASCII Files -->
<fl:when test=" @{fixLF} ">
<fixcrlf
excludes="**/*.jar **/*.tar **/*.zip **/*.ear **/*.class"
srcdir="@{stagedir}"
eol="lf"
eof="remove"
fixlast="true"
/>
</fl:when>
<!-- // T i m e o u t -->
<parallel threadcount="1" timeout="@{timeout}">
<!-- create remotedir ? -->
<fl:when test=" @{createremote} ">
<sshexec host="@{host}"
username="@{userid}"
knownhosts="@{knownhosts}"
keyfile="@{ppk}"
command="mkdir -p @{remotedir}"
/>
</fl:when>
<!-- delete contents in remotedir ?
will throw error if remotedir doesn't exist ! -->
<fl:when test=" @{deleteremote} ">
<sshexec host="@{host}"
username="@{userid}"
knownhosts="@{knownhosts}"
keyfile="@{ppk}"
command="cd @{remotedir};rm -rfe @{delfilepattern}"
/>
</fl:when>
<!-- Filetransfer from stagedir -->
<scp todir="@{userid}@@@{host}:@{remotedir}"
keyfile="@{ppk}"
knownhosts="@{knownhosts}"
sftp="true"
verbose="@{verbose}"
>
<fileset refid="stagecontents"/>
</scp>
</parallel>
<!-- T i m e o u t // -->
</fl:when>
<fl:otherwise>
<echo>
=============== SCP Transfer =============
Skip => NO StageDirContents !!
=============== SCP Transfer =============
</echo>
<fl:fail message="Stagedir [@{stagedir}] empty !!" test=" @{failstageempty} "/>
</fl:otherwise>
</fl:choose>
</sequential>
</macrodef>
</project>
由于我们最近才切换到Github,所以在这里获得了手册和一些示例。