使用get语句获取具有相似名称的一组文件的最新版本以供下载

时间:2017-09-19 17:57:33

标签: bash sftp sshpass

目前我使用以下命令将整个目录从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_ExtractsClicksAccount_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是唯一与第三种模式匹配的文件,因此无论修改日期如何,我们都会收到该文件。

如何为客户节省大量数据?

1 个答案:

答案 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