0

目前我正在使用以下命令将整个目录从 SFTP 服务器下载到我们自己的。问题是,这个目录每天都在变大,其中的大部分文件都不是必需的。所以我今天要做的是下载整个文件夹,然后清理不必要的文件夹。

但是我们的客户并不喜欢这种解决方案,因为它会导致大量的文件传输(他们为此付费)。

当前版本:

sshpass -p $FTP_PASS sftp -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-dss [USERNAME]@[SFTP_DOMAIN].com <<EOF

get -r Export
EOF

我想改进这个脚本,以便脚本搜索以特定字符串开头的文件,而不是下载整个文件夹,然后才能获取它们的最新版本。

例如

我们正在寻找以 or 或 or 开头的最新版本,Subscribers_Extracts我们ClicksAccount_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

请注意,我们根据修改日期而不是名称上的数字来选择文件。

另请注意,最后一个类型 akaAccount_Extract.csv是唯一与第三个模式匹配的文件,因此无论其修改日期如何,我们都会收到该文件。

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

4

1 回答 1

0

rsync 可以同步在最后给定时间内修改的文件,但为了更灵活,您可以检查文件的最后修改日期(以秒为单位):

date +%s -r filename

然后在循环中为每个文件名根执行检查(即检查每个f in Subscribers_Extract*),保存日期较高的文件名。

但是date -r不适用于 OS X 系统。

已编辑

如果您可以 ssh 进入远程服务器并执行 bash 脚本,这会给出最新修改的“订阅者_...”的名称,您可以复制该名称:

#!/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
于 2017-09-20T10:54:49.787 回答