ftp是不支持文件夹传输的(sftp可以),如果一定要通过ftp传输文件夹,可以有几种策略:
(1)如果条件允许可以使用ftp软件,FlashFTP,CuteFTP都是支持文件夹传输的。
(2)如果无法使用ftp工具可以使用考虑先打成压缩包,然后传过去解压缩以后再移动到指定目录,这是比较推荐的方式,但是会让脚本变得复杂一些,而且需要额外的压缩和解压缩时间。
(3)如果上面两个条件都不允许,必须使用shell脚本来完成这个任务,那么可以参考下面的方法。
shell脚本:
#! /bin/sh #bash ftpfloder.sh ip user pw /from /to if [ $# != 5 ] ; then echo "USAGE: $0 ip user pw /from /to" echo " e.g.: $0 ip user pw /from /to" exit 1; fi IP=$1 #服务器IP user=$2 #ftp用户名 password=$3 #ftp密码 fromdir=$4 #源目录 todir=$5 #目的目录 dirs=`find $fromdir -type d -printf $todir/'%P\n'| awk '{if ($0 == "")next;print "mkdir " $0}'` files=`find $fromdir -type f -printf 'put %p %P \n'` ftp -nv $IP <<EOF user $user $password type binary prompt $ dirs cd $todir $ files quit EOF
调用这个脚本的方法:
FTPTOOLPATH="/roo /ftpfolder.sh" FROMPATH="/root /from" #要上传的文件夹 TOPATH="/test/to" #目标文件夹 HOSTIP="10.80.59.1" #服务器 user=root #ftp用户名 password=271828#ftp密码 bash $FTPTOOLPATH $ HOSTIP $user $password $ FTPTOOLPATH $ TOPATH
整体思路:这是一个很笨的方法,使用ftp进行文件夹拷贝不行那么只好采取曲线救国的方式,先在目标目录生成文件夹的结构,然后再在这个基础上将需要传输的大量文件逐个的传过去。$dirs就是生成文件结构的操作,$ files是逐个传输文件到已经建立好的目录下的操作。
当然这样的操作存在一定的风险,那就是大量的文件传输的时候有可能会有文件损坏,在这一点上方法(3)是不及方法(2)的。
scp是基于ssh登录的,较于1中完全使用FTP的操作起来要方便很多。但存在一个问题是scp是基于基于安全认证的文件传输,无法在脚本里指定密码,需要在指令执行后手动输入密码,这对静默任务或者需要定时执行的任务来说是不适用的,但是对于单次任务来说是个不错的选择。
具体的使用是这样的
scp [可选参数] file_source file_target
传输文件:
scplocal_file remote_username@remote_ip:remote_folder
示例:
scp /home/daisy/[email protected]:/home/root
传输文件夹:
scp-r local_folder remote_username@remote_ip:remote_folder
示例:
scp-r /home/space/music/ [email protected]:/home/root/others/