需求:ftp獲取遠程數據的文件,根據文件的創建時間點下載文件。 可以自行擴展根據文件的大小等其他需求。 知識點總結: 1、獲取文件的時間: 時間內容: Sep 8 16:03 2、時間格式轉換 轉換結果: 201709081603 3、指定文件名,正則匹配 註意awk裡面模式變數用' '括起來,.* ...
需求:ftp獲取遠程數據的文件,根據文件的創建時間點下載文件。 可以自行擴展根據文件的大小等其他需求。
知識點總結:
1、獲取文件的時間:
ls -lrt|awk '{print $6" "$7" "$8}'
時間內容:
Sep 8 16:03
2、時間格式轉換
date -d "Sep 8 16:03" +%Y%m%d%H%M
轉換結果:
201709081603
3、指定文件名,正則匹配
pattern="${month}.*.dat$" ls -lrt |awk '$9 ~ /'$pattern'/ {print $6" "$7" "$8}'
註意awk裡面模式變數用' '括起來,.*為任意字元,$表示以dat結尾。pattern的內容根據需求自行設定
4、對文件時間進行比較
ls -lrt |awk '$9 ~ /'$pattern'/ {\ ctime="date -d \""$6" "$7" "$8"\" +%Y%m%d%H%M"; \ ctime|getline filetime; if( filetime > '$checktime' ) print $9 ; }
獲取文件的時間,對時間進行轉換,然後對轉換後的時間與給定的$checktime進行比較,如果比$checkime的時間大,則顯示文件名。
|getline 為執行命令獲取命令執行的結果。
以上就完成了對本地文件時間進行比較的方法。接下來判斷遠程主機的文件時間。
5、ftp命令登錄遠程主機,並過濾得到要查詢的文件內容
ftp_cmd(){ ftp -i -n <<! open $ftp_ip user $get_user $get_pwd binary cd ${get_dir} lcd ${local_dir} $* bye ! }
pattern="${month}.*.dat$"
files=$(ftp_cmd ls -lrt |awk '$9 ~ /'$pattern'/ {\
ctime="date -d \""$6" "$7" "$8"\" +%Y%m%d%H%M"; \
ctime|getline filetime; if( filetime > '$checktime' ) print $9 ; }'|xargs)
通過函數調用實現ftp到指定主機,cd到指定目錄,通過awk獲取ls -lrt的結果,然後計算時間,把大於指定時間的文件名獲取到。
6、下載文件
ftp_cmd mget $files
註意:如果匹配的文件量過大,採用這種方法下載文件有bug, 可以考慮分批下載。
講講其他shell命令註意的地方:
- 自加
num=$[ $num + 1 ];
- 為空判斷
if [ "$pro"x == ""x ]; then
...
fi
如果不加x,當$pro為空的時候,會報異常
- if的多條件判斷 -o
if [ "$pro"x == "$province"x -o "$pro"x == ""x ];then
...
fi