我們知道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 語句