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\n'| awk '{if ($0 == "")next;print "mkdir " $0}'` files=`find $updir -type f -printf 'put %p %P \n'` ftp -nv $host <<EOF user ${user} ${passwd} type binary $dirs cd $todir $files quit EOF

  命令解析:

dirs=`find $updir -type d -printf $todir/'%P\n'| awk '{if ($0 == "")next;print "mkdir " $0}'` 
find $updir -type d -printf $todir/'%P\n':將上傳的目錄格式化輸出;%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":\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 \n'`
這一命令是找出目錄中的文件,然后拼成put 語句
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM