zoukankan      html  css  js  c++  java
  • shell中利用ftp 上传文件夹功能

      我们知道ftp 只能用来上传或者下载文件,一次单个或者多个,怎么实现将文件夹的上传和下载呢?

    可以利用先在remote ip上建立一个相同的文件夹目录,然后将文件放到各自的目录中去

    1、循环遍历出要上传的文件夹中的文件夹目录

    2、遍历出每个文件夹下的文件

    3、逐一上传文件

    ftp 命令

    图中有众多的交互,我们不想让他显示这些交互

    可以使用参数 屏蔽掉

    ftp [-v] [-n] [-i] [-d] [-g] [-s:filename] [-a] [-w:windowsize] [computer]

    参数
    -v 禁止显示远程服务器响应。
    -n 禁止自动登录到初始连接。
    -I 多个文件传送时关闭交互提示。
    -d 启用调试、显示在客户端和服务器之间传递的所有 ftp 命令。
    -g 禁用文件名组,它允许在本地文件和路径名中使用通配符字符(* 和 ?)。(请参阅联机“命令参考”中的 glob 命令。)
    -s: filename指定包含 ftp 命令的文本文件;当 ftp 启动后,这些命令将自动运行。该参数中不允许有空格。使用该开关而不是重定向 (>)。
    -a 在捆绑数据连接时使用任何本地接口。
    -w:windowsize 替代默认大小为 4096 的传送缓冲区。
         Computer 指定要连接到远程计算机的计算机名或 IP 地址。如果指定,计算机必须是行的最后一个参数。
    下面是一些常用命令:
    !:   从ftp子系统退出到系统外壳
    ?:     显示ftp说明,跟help一样
    append: 添加文件,格式为:append 本地文件远程文件
    cd:   更换远程目录
    lcd:  更换本地目录,若无参数,将显示当前目录
    open: 与指定的ftp服务器连接 open computer [port]
    close:结束与远程服务器的 FTP 会话并返回命令解释程序
    bye:     结束与远程计算机的 FTP 会话并退出 ftp
    dir:  结束与远程计算机的 FTP 会话并退出 ftp
    get 和 recv:使用当前文件转换类型将远程文件复制到本地计算机 get remote-file [local-file]
    send 和 put: 上传文件:send local-file [remote-file]
     
    将这些命令组合成脚本
    #!/bin/bash
    host='127.0.0.1'
    user='root'
    passwd='1988'
    updir=/opt/123
    todir=123
    dirs=`find $updir -type d -printf $todir/'%P '| awk '{if ($0 == "")next;print "mkdir " $0}'` files=`find $updir -type f -printf 'put %p %P '` ftp -nv $host <<EOF user ${user} ${passwd} type binary $dirs cd $todir $files quit EOF

      命令解析:

    dirs=`find $updir -type d -printf $todir/'%P
    '| awk '{if ($0 == "")next;print "mkdir " $0}'` 
    find $updir -type d -printf $todir/'%P
    ':将上传的目录格式化输出;%P只输出指定目录下的文件夹,而输出他的上层目录,所以要加上一个上层目录
    awk 中的{if($0=="")next},next跳过了目录是空的情况
    awk next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。
    next的实例:
    text.txt 内容是:
    
    a
    b
    c
    d
    e
    
     
    
    [chengmo@centos5 shell]$ awk 'NR%2==1{next}{print NR,$0;}' text.txt     
    2 b
    4 d
    
    当记录行号除以2余 1,就跳过当前行。下面的print NR,$0也不会执行。 下一行开始,程序有开始判断NR%2 值。这个时候记录行号是:2 ,就会执行下面语句块:'print NR,$0'
    

      

    要求:
    
    文件:text.txt 格式:
    web01[192.168.2.100]
    
    httpd            ok
    tomcat               ok
    sendmail               ok
    web02[192.168.2.101]
    httpd            ok
    postfix               ok
    web03[192.168.2.102]
    mysqld            ok
    httpd               ok
    
     
    
    需要通过awk将输出格式变成:
    
    web01[192.168.2.100]:   httpd            ok
    web01[192.168.2.100]:   tomcat               ok
    web01[192.168.2.100]:   sendmail               ok
    web02[192.168.2.101]:   httpd            ok
    web02[192.168.2.101]:   postfix               ok
    web03[192.168.2.102]:   mysqld            ok
    web03[192.168.2.102]:   httpd               ok
    
     
    
    分析:
    
    分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行。
    
    [chengmo@centos5 shell]$ awk '/^web/{T=$0;next;}{print T":	"$0;}' test.txt
    
    web01[192.168.2.100]:   httpd            ok
    web01[192.168.2.100]:   tomcat               ok
    web01[192.168.2.100]:   sendmail               ok
    web02[192.168.2.101]:   httpd            ok
    web02[192.168.2.101]:   postfix               ok
    web03[192.168.2.102]:   mysqld            ok
    web03[192.168.2.102]:   httpd               ok
    

      

    files=`find $updir -type f -printf 'put %p %P 
    '`
    这一命令是找出目录中的文件,然后拼成put 语句
     
  • 相关阅读:
    codesmith+mysql生成代码
    遭遇笔试
    线性是一种简洁,简洁就是美
    Microsoft Kinect SDK vs PrimeSense OpenNI
    资料收集:让OpenCV使用IPP
    提纲
    在PC上安装使用Kinect
    OpenNI设置Kinect帧率,读取IR图
    cout,rather than printf
    单步调试时,getnextframe会失败。又
  • 原文地址:https://www.cnblogs.com/ggbond1988/p/4816044.html
Copyright © 2011-2022 走看看