目前我使用以下命令将整个目录从SFTP服务器下载到我们自己的目录。问题是,这个目录每天都变大,并且其中的大多数文件都不是必需的。所以今天我做的是下载整个文件夹,然后清理不必要的文件夹。
但我们的客户并不喜欢这种解决方案,因为它会导致大量的文件传输(他们正在为此付费)。
当前版本:
sshpass -p $FTP_PASS sftp -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-dss [USERNAME]@[SFTP_DOMAIN].com <<EOF
get -r Export
EOF
我想改进这个脚本,以便脚本不是下载整个文件夹,而是搜索以特定字符串开头的文件,然后才获取最新版本的文件。
E.g。
我们正在寻找以Subscribers_Extracts
或Clicks
或Account_Extract
开头的最新版本,我们在目录中有以下列表:
Subscribers_Extracts_1.csv
Subscribers_Extracts_2.csv
Subscribers_Extracts_3.csv
Subscribers_Extracts_4.csv (latest modified)
Clicks_ftyftyf.csv
Clicks_67546754675.csv (latest modified)
Clicks_783635ghgh.csv
Account_Extract_uguyfuyfuf.csv
然后我们应该下载的文件是
Subscribers_Extracts_4.csv
Clicks_67546754675.csv
Account_Extract.csv
请注意,我们根据修改日期选择了文件,而不是名称上的数字。
另请注意,最后一种类型Account_Extract.csv
是唯一与第三种模式匹配的文件,因此无论修改日期如何,我们都会收到该文件。
如何为客户节省大量数据?
答案 0 :(得分:0)
rsync可以同步在最后给定时间内修改的文件,但是对于更灵活的内容,您可以使用以下命令检查文件的上次修改日期(以秒为单位):
date +%s -r filename
然后在循环中为每个文件名根执行检查(即检查每个f in Subscribers_Extract*
),保存日期更高的文件名。
但是date -r
在OS X系统上不起作用。
EDITED
如果你可以ssh到远程服务器并执行bash脚本,这会给你修改的最新“Subscribers _...”的名称,你可以复制:
#!/bin/bash
list="$( ls Subscribers_Extract* )"
names=( $list )
nr_names=${#names[@]}
date_modify=0
file_to_copy="none"
for i in `seq 0 $(( nr_names - 1 ))`
do date_tmp=`date +%s -r ${names[$i]}`
if (( $date_tmp>$date_modify ))
then
date_modify=$date_tmp
file_to_copy=${names[$i]}
fi
done
echo $file_to_copy