我有一个程序,可以从五个政府来源获取数据,并将它们合并到我公司的一个大型数据库中。我使用 wget 来检索文件。然而我发现其中一个来源每次更新时都会更改名称。
例如,我上次获取该文件时,它的名称是myfile150727.flatfile
.今天,当我尝试运行我的程序时,我得到了退出状态 8 no such file
。当我手动进入 ftp 时,我发现该文件现在名为myfile150914.flatfile
.显然,文件名根据上次更新的日期而变化。
我可以修改我的脚本以考虑这一事实并仍然自动下载文件吗?
答案1
是的,但详细信息取决于文件名称的更改方式。如果它始终是今天的日期,只需告诉您的脚本即可获取该日期:
filename=myfile"$(date +%y%m%d)".flatfile
wget ftp://example.com/"$file"
或者,如果它不是每天更新并且只有一个名为 的文件myfileWHATEVER.flatfile
,请获取:
wget "ftp://example.com/myfile*.flatfile"
如果您有许多具有相似名称的文件,您可以下载所有文件,然后仅保留最新的:
wget -N "ftp://example.com/myfile*.flatfile"
## Find the newest file
for file in myfile*.flatfile; do
[[ "$file" -nt "$newest" ]] && newest="$file";
done
## Delete the rest
for file in myfile*.flatfile; do
[[ "$file" != "$newest" ]] && rm "$file"
done
或者,您可以从文件名中提取日期:
wget -N "ftp://example.com/myfile*.flatfile"
for file in myfile*.flatfile; do
fdate=$(basename "${file//myfile}" .flatfile)
[[ "$fdate" -gt $(basename "${nfile//myfile}" .flatfile) ]] && nfile="$file"
done
for file in myfile*.flatfile; do
[[ "$file" = "$nfile" ]] || rm "$file"
done
请注意,如果多个文件具有相同的修改日期,则上述内容将保留多个文件。
答案2
就像是
for site in site1.com site2.com
do
mkdir -p $site
ftp -in <<EOF
connect $site
user archemar foo
lcd $site
cd /path/to/remote/file
mget myfile*.fileflat
quit
EOF
done
- 替换
user archemar foo
为您的用户名和密码,或者user ftp
如果允许匿名 ftp。 - 替换
cd /path/to/remote/file
为明显的 - 这会将杂项 *.flatfile 放置在相应的站点目录中。如果名称是唯一的,则删除
mkdir $site
和lcd $site
。 - 根据您的更新流程,您可能希望在
rm
传输之前进行。